synapse-storage 3.0.16 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +657 -127
- package/dist/_utils/chunk.util.d.ts +8 -0
- package/dist/_utils/chunk.util.d.ts.map +1 -0
- package/dist/_utils/chunk.util.js +21 -0
- package/dist/_utils/chunk.util.js.map +1 -0
- package/dist/_utils/deepMerge.util.d.ts +2 -0
- package/dist/_utils/deepMerge.util.d.ts.map +1 -0
- package/dist/_utils/deepMerge.util.js +19 -0
- package/dist/_utils/deepMerge.util.js.map +1 -0
- package/dist/_utils/error-handling.util.d.ts +50 -0
- package/dist/_utils/error-handling.util.d.ts.map +1 -0
- package/dist/_utils/error-handling.util.js +67 -0
- package/dist/_utils/error-handling.util.js.map +1 -0
- package/dist/_utils/flatMap.util.d.ts +10 -0
- package/dist/_utils/flatMap.util.d.ts.map +1 -0
- package/dist/_utils/flatMap.util.js +23 -0
- package/dist/_utils/flatMap.util.js.map +1 -0
- package/dist/_utils/index.d.ts +6 -0
- package/dist/_utils/index.d.ts.map +1 -0
- package/dist/_utils/index.js +13 -0
- package/dist/_utils/index.js.map +1 -0
- package/dist/_utils/logger-console.util.d.ts +9 -0
- package/dist/_utils/logger-console.util.d.ts.map +1 -0
- package/dist/_utils/logger-console.util.js +14 -0
- package/dist/_utils/logger-console.util.js.map +1 -0
- package/dist/api/api.module.d.ts +46 -0
- package/dist/api/api.module.d.ts.map +1 -0
- package/dist/api/api.module.js +121 -0
- package/dist/api/api.module.js.map +1 -0
- package/dist/api/components/endpoint.d.ts +57 -0
- package/dist/api/components/endpoint.d.ts.map +1 -0
- package/dist/api/components/endpoint.js +385 -0
- package/dist/api/components/endpoint.js.map +1 -0
- package/dist/api/components/query-storage.d.ts +100 -0
- package/dist/api/components/query-storage.d.ts.map +1 -0
- package/dist/api/components/query-storage.js +293 -0
- package/dist/api/components/query-storage.js.map +1 -0
- package/dist/api/example.d.ts +83 -0
- package/dist/api/example.d.ts.map +1 -0
- package/dist/api/example.js +90 -0
- package/dist/api/example.js.map +1 -0
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +11 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/types/api.interface.d.ts +126 -0
- package/dist/api/types/api.interface.d.ts.map +1 -0
- package/dist/api/types/api.interface.js +15 -0
- package/dist/api/types/api.interface.js.map +1 -0
- package/dist/api/types/endpoint.interface.d.ts +118 -0
- package/dist/api/types/endpoint.interface.d.ts.map +1 -0
- package/dist/api/types/endpoint.interface.js +6 -0
- package/dist/api/types/endpoint.interface.js.map +1 -0
- package/dist/api/types/query.interface.d.ts +85 -0
- package/dist/api/types/query.interface.d.ts.map +1 -0
- package/dist/api/types/query.interface.js +6 -0
- package/dist/api/types/query.interface.js.map +1 -0
- package/dist/api/utils/api-helpers.d.ts +22 -0
- package/dist/api/utils/api-helpers.d.ts.map +1 -0
- package/dist/api/utils/api-helpers.js +44 -0
- package/dist/api/utils/api-helpers.js.map +1 -0
- package/dist/api/utils/create-header-context.d.ts +10 -0
- package/dist/api/utils/create-header-context.d.ts.map +1 -0
- package/dist/api/utils/create-header-context.js +40 -0
- package/dist/api/utils/create-header-context.js.map +1 -0
- package/dist/api/utils/endpoint-headers.d.ts +23 -0
- package/dist/api/utils/endpoint-headers.d.ts.map +1 -0
- package/dist/api/utils/endpoint-headers.js +61 -0
- package/dist/api/utils/endpoint-headers.js.map +1 -0
- package/dist/api/utils/fetch-base-query.d.ts +9 -0
- package/dist/api/utils/fetch-base-query.d.ts.map +1 -0
- package/dist/api/utils/fetch-base-query.js +242 -0
- package/dist/api/utils/fetch-base-query.js.map +1 -0
- package/dist/api/utils/file-utils.d.ts +43 -0
- package/dist/api/utils/file-utils.d.ts.map +1 -0
- package/dist/api/utils/file-utils.js +102 -0
- package/dist/api/utils/file-utils.js.map +1 -0
- package/dist/api/utils/get-cacheable-headers.d.ts +8 -0
- package/dist/api/utils/get-cacheable-headers.d.ts.map +1 -0
- package/dist/api/utils/get-cacheable-headers.js +23 -0
- package/dist/api/utils/get-cacheable-headers.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/selector/index.d.ts +3 -0
- package/dist/core/selector/index.d.ts.map +1 -0
- package/dist/core/selector/index.js +5 -0
- package/dist/core/selector/index.js.map +1 -0
- package/dist/{selector.interface-CA5y-kD_.d.ts → core/selector/selector.interface.d.ts} +41 -8
- package/dist/core/selector/selector.interface.d.ts.map +1 -0
- package/dist/core/selector/selector.interface.js +7 -0
- package/dist/core/selector/selector.interface.js.map +1 -0
- package/dist/core/selector/selector.module.d.ts +36 -0
- package/dist/core/selector/selector.module.d.ts.map +1 -0
- package/dist/core/selector/selector.module.js +412 -0
- package/dist/core/selector/selector.module.js.map +1 -0
- package/dist/core/storage/adapters/async-base-storage.service.d.ts +49 -0
- package/dist/core/storage/adapters/async-base-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/async-base-storage.service.js +505 -0
- package/dist/core/storage/adapters/async-base-storage.service.js.map +1 -0
- package/dist/core/storage/adapters/indexed-DB.service.d.ts +89 -0
- package/dist/core/storage/adapters/indexed-DB.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/indexed-DB.service.js +596 -0
- package/dist/core/storage/adapters/indexed-DB.service.js.map +1 -0
- package/dist/core/storage/adapters/local-storage.service.d.ts +23 -0
- package/dist/core/storage/adapters/local-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/local-storage.service.js +111 -0
- package/dist/core/storage/adapters/local-storage.service.js.map +1 -0
- package/dist/core/storage/adapters/memory-storage.service.d.ts +24 -0
- package/dist/core/storage/adapters/memory-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/memory-storage.service.js +110 -0
- package/dist/core/storage/adapters/memory-storage.service.js.map +1 -0
- package/dist/core/storage/adapters/path.utils.d.ts +5 -0
- package/dist/core/storage/adapters/path.utils.d.ts.map +1 -0
- package/dist/core/storage/adapters/path.utils.js +42 -0
- package/dist/core/storage/adapters/path.utils.js.map +1 -0
- package/dist/core/storage/adapters/storage-core.d.ts +61 -0
- package/dist/core/storage/adapters/storage-core.d.ts.map +1 -0
- package/dist/core/storage/adapters/storage-core.js +221 -0
- package/dist/core/storage/adapters/storage-core.js.map +1 -0
- package/dist/core/storage/adapters/sync-base-storage.service.d.ts +56 -0
- package/dist/core/storage/adapters/sync-base-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/sync-base-storage.service.js +481 -0
- package/dist/core/storage/adapters/sync-base-storage.service.js.map +1 -0
- package/dist/core/storage/index.d.ts +16 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +38 -0
- package/dist/core/storage/index.js.map +1 -0
- package/dist/core/storage/middlewares/broadcast.middleware.d.ts +9 -0
- package/dist/core/storage/middlewares/broadcast.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/broadcast.middleware.js +197 -0
- package/dist/core/storage/middlewares/broadcast.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/index.d.ts +9 -0
- package/dist/core/storage/middlewares/index.d.ts.map +1 -0
- package/dist/core/storage/middlewares/index.js +17 -0
- package/dist/core/storage/middlewares/index.js.map +1 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.js +108 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js +43 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts +9 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.js +177 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts +6 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.js +56 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js +39 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.interface.d.ts +101 -0
- package/dist/core/storage/modules/plugin/plugin.interface.d.ts.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.interface.js +8 -0
- package/dist/core/storage/modules/plugin/plugin.interface.js.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.service.d.ts +49 -0
- package/dist/core/storage/modules/plugin/plugin.service.d.ts.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.service.js +406 -0
- package/dist/core/storage/modules/plugin/plugin.service.js.map +1 -0
- package/dist/core/storage/modules/singleton/mixin.util.d.ts +6 -0
- package/dist/core/storage/modules/singleton/mixin.util.d.ts.map +1 -0
- package/dist/core/storage/modules/singleton/mixin.util.js +30 -0
- package/dist/core/storage/modules/singleton/mixin.util.js.map +1 -0
- package/dist/core/storage/modules/singleton/models.d.ts +143 -0
- package/dist/core/storage/modules/singleton/models.d.ts.map +1 -0
- package/dist/core/storage/modules/singleton/models.js +60 -0
- package/dist/core/storage/modules/singleton/models.js.map +1 -0
- package/dist/core/storage/modules/singleton/singleton.util.d.ts +36 -0
- package/dist/core/storage/modules/singleton/singleton.util.d.ts.map +1 -0
- package/dist/core/storage/modules/singleton/singleton.util.js +216 -0
- package/dist/core/storage/modules/singleton/singleton.util.js.map +1 -0
- package/dist/core/storage/storage.interface.d.ts +168 -0
- package/dist/core/storage/storage.interface.d.ts.map +1 -0
- package/dist/core/storage/storage.interface.js +23 -0
- package/dist/core/storage/storage.interface.js.map +1 -0
- package/dist/core/storage/utils/broadcast.util.d.ts +49 -0
- package/dist/core/storage/utils/broadcast.util.d.ts.map +1 -0
- package/dist/core/storage/utils/broadcast.util.js +141 -0
- package/dist/core/storage/utils/broadcast.util.js.map +1 -0
- package/dist/core/storage/utils/cache.util.d.ts +33 -0
- package/dist/core/storage/utils/cache.util.d.ts.map +1 -0
- package/dist/core/storage/utils/cache.util.js +54 -0
- package/dist/core/storage/utils/cache.util.js.map +1 -0
- package/dist/core/storage/utils/middleware-module.d.ts +94 -0
- package/dist/core/storage/utils/middleware-module.d.ts.map +1 -0
- package/dist/core/storage/utils/middleware-module.js +258 -0
- package/dist/core/storage/utils/middleware-module.js.map +1 -0
- package/dist/core/storage/utils/path-selector.util.d.ts +15 -0
- package/dist/core/storage/utils/path-selector.util.d.ts.map +1 -0
- package/dist/core/storage/utils/path-selector.util.js +58 -0
- package/dist/core/storage/utils/path-selector.util.js.map +1 -0
- package/dist/core/storage/utils/state-diff.util.d.ts +14 -0
- package/dist/core/storage/utils/state-diff.util.d.ts.map +1 -0
- package/dist/core/storage/utils/state-diff.util.js +88 -0
- package/dist/core/storage/utils/state-diff.util.js.map +1 -0
- package/dist/core/storage/utils/storage-factory.util.d.ts +21 -0
- package/dist/core/storage/utils/storage-factory.util.d.ts.map +1 -0
- package/dist/core/storage/utils/storage-factory.util.js +40 -0
- package/dist/core/storage/utils/storage-factory.util.js.map +1 -0
- package/dist/core/storage/utils/storage-key.d.ts +11 -0
- package/dist/core/storage/utils/storage-key.d.ts.map +1 -0
- package/dist/core/storage/utils/storage-key.js +24 -0
- package/dist/core/storage/utils/storage-key.js.map +1 -0
- package/dist/core/storage/utils/storage.utils.d.ts +17 -0
- package/dist/core/storage/utils/storage.utils.d.ts.map +1 -0
- package/dist/core/storage/utils/storage.utils.js +57 -0
- package/dist/core/storage/utils/storage.utils.js.map +1 -0
- package/dist/index.d.ts +10 -12
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -0
- package/dist/react/hooks/index.d.ts +5 -0
- package/dist/react/hooks/index.d.ts.map +1 -0
- package/dist/react/hooks/index.js +11 -0
- package/dist/react/hooks/index.js.map +1 -0
- package/dist/react/hooks/useCreateStorage.d.ts +39 -0
- package/dist/react/hooks/useCreateStorage.d.ts.map +1 -0
- package/dist/react/hooks/useCreateStorage.js +137 -0
- package/dist/react/hooks/useCreateStorage.js.map +1 -0
- package/dist/react/hooks/useSelector.d.ts +21 -0
- package/dist/react/hooks/useSelector.d.ts.map +1 -0
- package/dist/react/hooks/useSelector.js +56 -0
- package/dist/react/hooks/useSelector.js.map +1 -0
- package/dist/react/hooks/useStorage.d.ts +39 -0
- package/dist/react/hooks/useStorage.d.ts.map +1 -0
- package/dist/react/hooks/useStorage.js +78 -0
- package/dist/react/hooks/useStorage.js.map +1 -0
- package/dist/react/hooks/useStorageSubscribe.d.ts +16 -0
- package/dist/react/hooks/useStorageSubscribe.d.ts.map +1 -0
- package/dist/react/hooks/useStorageSubscribe.js +55 -0
- package/dist/react/hooks/useStorageSubscribe.js.map +1 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +7 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/utils/awaitSynapse.d.ts +34 -0
- package/dist/react/utils/awaitSynapse.d.ts.map +1 -0
- package/dist/react/utils/awaitSynapse.js +87 -0
- package/dist/react/utils/awaitSynapse.js.map +1 -0
- package/dist/react/utils/createSynapseCtx.d.ts +33 -0
- package/dist/react/utils/createSynapseCtx.d.ts.map +1 -0
- package/dist/react/utils/createSynapseCtx.js +139 -0
- package/dist/react/utils/createSynapseCtx.js.map +1 -0
- package/dist/react/utils/index.d.ts +3 -0
- package/dist/react/utils/index.d.ts.map +1 -0
- package/dist/react/utils/index.js +9 -0
- package/dist/react/utils/index.js.map +1 -0
- package/dist/reactive/dispatcher/dispatcher.module.d.ts +216 -0
- package/dist/reactive/dispatcher/dispatcher.module.d.ts.map +1 -0
- package/dist/reactive/dispatcher/dispatcher.module.js +384 -0
- package/dist/reactive/dispatcher/dispatcher.module.js.map +1 -0
- package/dist/reactive/dispatcher/index.d.ts +4 -0
- package/dist/reactive/dispatcher/index.d.ts.map +1 -0
- package/dist/reactive/dispatcher/index.js +9 -0
- package/dist/reactive/dispatcher/index.js.map +1 -0
- package/dist/reactive/dispatcher/middlewares/index.d.ts +2 -0
- package/dist/reactive/dispatcher/middlewares/index.d.ts.map +1 -0
- package/dist/reactive/dispatcher/middlewares/index.js +5 -0
- package/dist/reactive/dispatcher/middlewares/index.js.map +1 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts +37 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts.map +1 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.js +188 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.js.map +1 -0
- package/dist/reactive/dispatcher/standalone.d.ts +112 -0
- package/dist/reactive/dispatcher/standalone.d.ts.map +1 -0
- package/dist/reactive/dispatcher/standalone.js +142 -0
- package/dist/reactive/dispatcher/standalone.js.map +1 -0
- package/dist/reactive/effects/effects.module.d.ts +225 -0
- package/dist/reactive/effects/effects.module.d.ts.map +1 -0
- package/dist/reactive/effects/effects.module.js +356 -0
- package/dist/reactive/effects/effects.module.js.map +1 -0
- package/dist/reactive/effects/index.d.ts +4 -0
- package/dist/reactive/effects/index.d.ts.map +1 -0
- package/dist/reactive/effects/index.js +11 -0
- package/dist/reactive/effects/index.js.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts +12 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.js +25 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.js.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.d.ts +12 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.d.ts.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.js +22 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.js.map +1 -0
- package/dist/reactive/effects/utils/fromRequest.d.ts +40 -0
- package/dist/reactive/effects/utils/fromRequest.d.ts.map +1 -0
- package/dist/reactive/effects/utils/fromRequest.js +64 -0
- package/dist/reactive/effects/utils/fromRequest.js.map +1 -0
- package/dist/reactive/effects/utils/index.d.ts +5 -0
- package/dist/reactive/effects/utils/index.d.ts.map +1 -0
- package/dist/reactive/effects/utils/index.js +11 -0
- package/dist/reactive/effects/utils/index.js.map +1 -0
- package/dist/reactive/effects/utils/toObservable.d.ts +23 -0
- package/dist/reactive/effects/utils/toObservable.d.ts.map +1 -0
- package/dist/reactive/effects/utils/toObservable.js +39 -0
- package/dist/reactive/effects/utils/toObservable.js.map +1 -0
- package/dist/reactive/index.d.ts +3 -0
- package/dist/reactive/index.d.ts.map +1 -0
- package/dist/reactive/index.js +7 -0
- package/dist/reactive/index.js.map +1 -0
- package/dist/utils/createEventBus.d.ts +87 -0
- package/dist/utils/createEventBus.d.ts.map +1 -0
- package/dist/utils/createEventBus.js +215 -0
- package/dist/utils/createEventBus.js.map +1 -0
- package/dist/utils/createSynapse/createSynapse.d.ts +9 -0
- package/dist/utils/createSynapse/createSynapse.d.ts.map +1 -0
- package/dist/utils/createSynapse/createSynapse.js +103 -0
- package/dist/utils/createSynapse/createSynapse.js.map +1 -0
- package/dist/utils/createSynapse/index.d.ts +3 -0
- package/dist/utils/createSynapse/index.d.ts.map +1 -0
- package/dist/utils/createSynapse/index.js +6 -0
- package/dist/utils/createSynapse/index.js.map +1 -0
- package/dist/utils/createSynapse/types.d.ts +93 -0
- package/dist/utils/createSynapse/types.d.ts.map +1 -0
- package/dist/utils/createSynapse/types.js +6 -0
- package/dist/utils/createSynapse/types.js.map +1 -0
- package/dist/utils/createSynapse/validate.d.ts +2 -0
- package/dist/utils/createSynapse/validate.d.ts.map +1 -0
- package/dist/utils/createSynapse/validate.js +76 -0
- package/dist/utils/createSynapse/validate.js.map +1 -0
- package/dist/utils/createSynapse/waitForDependencies.d.ts +3 -0
- package/dist/utils/createSynapse/waitForDependencies.d.ts.map +1 -0
- package/dist/utils/createSynapse/waitForDependencies.js +40 -0
- package/dist/utils/createSynapse/waitForDependencies.js.map +1 -0
- package/dist/utils/createSynapseAwaiter.d.ts +46 -0
- package/dist/utils/createSynapseAwaiter.d.ts.map +1 -0
- package/dist/utils/createSynapseAwaiter.js +102 -0
- package/dist/utils/createSynapseAwaiter.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +17 -21
- package/dist/api.d.ts +0 -365
- package/dist/api.js +0 -1
- package/dist/core.d.ts +0 -95
- package/dist/core.js +0 -1
- package/dist/createSynapse-BLbPlWXK.d.ts +0 -97
- package/dist/dispatcher.module-DcXkCRNj.d.ts +0 -360
- package/dist/react.d.ts +0 -98
- package/dist/react.js +0 -1
- package/dist/reactive.d.ts +0 -35
- package/dist/reactive.js +0 -1
- package/dist/storage.interface-2HKvqdAJ.d.ts +0 -444
- package/dist/utils.d.ts +0 -139
- package/dist/utils.js +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface StorageUtils {
|
|
2
|
+
pathUtils: {
|
|
3
|
+
join(...parts: string[]): string;
|
|
4
|
+
getParent(path: string): string;
|
|
5
|
+
isSubPath(parent: string, child: string): boolean;
|
|
6
|
+
getSegments(path: string): string[];
|
|
7
|
+
};
|
|
8
|
+
dataUtils: {
|
|
9
|
+
flatten(obj: any, prefix?: string): Record<string, any>;
|
|
10
|
+
unflatten(flat: Record<string, any>): any;
|
|
11
|
+
clone<T>(data: T): T;
|
|
12
|
+
merge(target: any, source: any): any;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare const pathUtils: StorageUtils['pathUtils'];
|
|
16
|
+
export declare const dataUtils: StorageUtils['dataUtils'];
|
|
17
|
+
//# sourceMappingURL=storage.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.utils.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/utils/storage.utils.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAE3B,SAAS,EAAE;QACT,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;QAChC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;QAC/B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;QACjD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KACpC,CAAA;IAGD,SAAS,EAAE;QACT,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACvD,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;QACzC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAA;QACpB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAAA;KACrC,CAAA;CACF;AAED,eAAO,MAAM,SAAS,EAAE,YAAY,CAAC,WAAW,CAQ/C,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,YAAY,CAAC,WAAW,CAuD/C,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const pathUtils = {
|
|
2
|
+
join: (...parts)=>parts.filter(Boolean).join('.'),
|
|
3
|
+
getParent: (path)=>{
|
|
4
|
+
const segments = path.split('.');
|
|
5
|
+
return segments.slice(0, -1).join('.');
|
|
6
|
+
},
|
|
7
|
+
isSubPath: (parent, child)=>child.startsWith(`${parent}.`),
|
|
8
|
+
getSegments: (path)=>path.split('.')
|
|
9
|
+
};
|
|
10
|
+
const dataUtils = {
|
|
11
|
+
flatten: (obj, prefix = '')=>Object.keys(obj).reduce((acc, key)=>{
|
|
12
|
+
const prefixKey = prefix ? `${prefix}.${key}` : key;
|
|
13
|
+
if (typeof obj[key] === 'object' && obj[key] !== null) {
|
|
14
|
+
if (Array.isArray(obj[key])) {
|
|
15
|
+
acc[prefixKey] = obj[key];
|
|
16
|
+
} else {
|
|
17
|
+
Object.assign(acc, dataUtils.flatten(obj[key], prefixKey));
|
|
18
|
+
}
|
|
19
|
+
} else {
|
|
20
|
+
acc[prefixKey] = obj[key];
|
|
21
|
+
}
|
|
22
|
+
return acc;
|
|
23
|
+
}, {}),
|
|
24
|
+
unflatten: (flat)=>{
|
|
25
|
+
const result = {};
|
|
26
|
+
for(const key in flat){
|
|
27
|
+
const segments = pathUtils.getSegments(key);
|
|
28
|
+
let current = result;
|
|
29
|
+
for(let i = 0; i < segments.length - 1; i++){
|
|
30
|
+
const segment = segments[i];
|
|
31
|
+
current[segment] = current[segment] || {};
|
|
32
|
+
current = current[segment];
|
|
33
|
+
}
|
|
34
|
+
current[segments[segments.length - 1]] = flat[key];
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
},
|
|
38
|
+
clone: (data)=>JSON.parse(JSON.stringify(data)),
|
|
39
|
+
merge: (target, source)=>{
|
|
40
|
+
const merged = dataUtils.clone(target);
|
|
41
|
+
for(const key in source){
|
|
42
|
+
if (typeof source[key] === 'object' && source[key] !== null) {
|
|
43
|
+
if (typeof merged[key] !== 'object') {
|
|
44
|
+
merged[key] = {};
|
|
45
|
+
}
|
|
46
|
+
merged[key] = dataUtils.merge(merged[key], source[key]);
|
|
47
|
+
} else {
|
|
48
|
+
merged[key] = source[key];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return merged;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export { dataUtils, pathUtils };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=storage.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/storage/utils/storage.utils.js","sources":["../../../../src/core/storage/utils/storage.utils.ts"],"sourcesContent":["export interface StorageUtils {\n // Утилиты для работы с путями\n pathUtils: {\n join(...parts: string[]): string\n getParent(path: string): string\n isSubPath(parent: string, child: string): boolean\n getSegments(path: string): string[]\n }\n\n // Утилиты для работы с данными\n dataUtils: {\n flatten(obj: any, prefix?: string): Record<string, any>\n unflatten(flat: Record<string, any>): any\n clone<T>(data: T): T\n merge(target: any, source: any): any\n }\n}\n\nexport const pathUtils: StorageUtils['pathUtils'] = {\n join: (...parts: string[]): string => parts.filter(Boolean).join('.'),\n getParent: (path: string): string => {\n const segments = path.split('.')\n return segments.slice(0, -1).join('.')\n },\n isSubPath: (parent: string, child: string): boolean => child.startsWith(`${parent}.`),\n getSegments: (path: string): string[] => path.split('.'),\n}\n\nexport const dataUtils: StorageUtils['dataUtils'] = {\n flatten: (obj: any, prefix = ''): Record<string, any> =>\n Object.keys(obj).reduce(\n (acc, key) => {\n const prefixKey = prefix ? `${prefix}.${key}` : key\n\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n if (Array.isArray(obj[key])) {\n acc[prefixKey] = obj[key]\n } else {\n Object.assign(acc, dataUtils.flatten(obj[key], prefixKey))\n }\n } else {\n acc[prefixKey] = obj[key]\n }\n\n return acc\n },\n {} as Record<string, any>,\n ),\n unflatten: (flat: Record<string, any>): any => {\n const result = {}\n\n for (const key in flat) {\n const segments = pathUtils.getSegments(key)\n let current: Record<string, any> = result\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]\n current[segment] = current[segment] || {}\n current = current[segment]\n }\n\n current[segments[segments.length - 1]] = flat[key]\n }\n\n return result\n },\n clone: <T>(data: T): T => JSON.parse(JSON.stringify(data)),\n merge: (target: any, source: any): any => {\n const merged = dataUtils.clone(target)\n\n for (const key in source) {\n if (typeof source[key] === 'object' && source[key] !== null) {\n if (typeof merged[key] !== 'object') {\n merged[key] = {}\n }\n merged[key] = dataUtils.merge(merged[key], source[key])\n } else {\n merged[key] = source[key]\n }\n }\n\n return merged\n },\n}\n"],"names":["pathUtils","parts","Boolean","path","segments","parent","child","dataUtils","obj","prefix","Object","acc","key","prefixKey","Array","flat","result","current","i","segment","data","JSON","target","source","merged"],"mappings":"AAkBO,MAAMA,SAASA,GAA8B;IAClD,MAAM,CAAC,GAAGC,QAA4BA,MAAM,MAAM,CAACC,SAAS,IAAI,CAAC;IACjE,WAAW,CAACC;QACV,MAAMC,WAAWD,KAAK,KAAK,CAAC;QAC5B,OAAOC,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACpC;IACA,WAAW,CAACC,QAAgBC,QAA2BA,MAAM,UAAU,CAAC,GAAGD,OAAO,CAAC,CAAC;IACpF,aAAa,CAACF,OAA2BA,KAAK,KAAK,CAAC;AACtD,EAAC;AAEM,MAAMI,SAASA,GAA8B;IAClD,SAAS,CAACC,KAAUC,SAAS,EAAE,GAC7BC,OAAO,IAAI,CAACF,KAAK,MAAM,CACrB,CAACG,KAAKC;YACJ,MAAMC,YAAYJ,SAAS,GAAGA,OAAO,CAAC,EAAEG,KAAK,GAAGA;YAEhD,IAAI,OAAOJ,GAAG,CAACI,IAAI,KAAK,YAAYJ,GAAG,CAACI,IAAI,KAAK,MAAM;gBACrD,IAAIE,MAAM,OAAO,CAACN,GAAG,CAACI,IAAI,GAAG;oBAC3BD,GAAG,CAACE,UAAU,GAAGL,GAAG,CAACI,IAAI;gBAC3B,OAAO;oBACLF,OAAO,MAAM,CAACC,KAAKJ,SAASA,CAAC,OAAO,CAACC,GAAG,CAACI,IAAI,EAAEC;gBACjD;YACF,OAAO;gBACLF,GAAG,CAACE,UAAU,GAAGL,GAAG,CAACI,IAAI;YAC3B;YAEA,OAAOD;QACT,GACA,CAAC;IAEL,WAAW,CAACI;QACV,MAAMC,SAAS,CAAC;QAEhB,IAAK,MAAMJ,OAAOG,KAAM;YACtB,MAAMX,WAAWJ,SAASA,CAAC,WAAW,CAACY;YACvC,IAAIK,UAA+BD;YAEnC,IAAK,IAAIE,IAAI,GAAGA,IAAId,SAAS,MAAM,GAAG,GAAGc,IAAK;gBAC5C,MAAMC,UAAUf,QAAQ,CAACc,EAAE;gBAC3BD,OAAO,CAACE,QAAQ,GAAGF,OAAO,CAACE,QAAQ,IAAI,CAAC;gBACxCF,UAAUA,OAAO,CAACE,QAAQ;YAC5B;YAEAF,OAAO,CAACb,QAAQ,CAACA,SAAS,MAAM,GAAG,EAAE,CAAC,GAAGW,IAAI,CAACH,IAAI;QACpD;QAEA,OAAOI;IACT;IACA,OAAO,CAAII,OAAeC,KAAK,KAAK,CAACA,KAAK,SAAS,CAACD;IACpD,OAAO,CAACE,QAAaC;QACnB,MAAMC,SAASjB,SAASA,CAAC,KAAK,CAACe;QAE/B,IAAK,MAAMV,OAAOW,OAAQ;YACxB,IAAI,OAAOA,MAAM,CAACX,IAAI,KAAK,YAAYW,MAAM,CAACX,IAAI,KAAK,MAAM;gBAC3D,IAAI,OAAOY,MAAM,CAACZ,IAAI,KAAK,UAAU;oBACnCY,MAAM,CAACZ,IAAI,GAAG,CAAC;gBACjB;gBACAY,MAAM,CAACZ,IAAI,GAAGL,SAASA,CAAC,KAAK,CAACiB,MAAM,CAACZ,IAAI,EAAEW,MAAM,CAACX,IAAI;YACxD,OAAO;gBACLY,MAAM,CAACZ,IAAI,GAAGW,MAAM,CAACX,IAAI;YAC3B;QACF;QAEA,OAAOY;IACT;AACF,EAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
import 'react';
|
|
12
|
-
import 'rxjs';
|
|
1
|
+
/**
|
|
2
|
+
* Synapse - Библиотека управления состоянием и API-клиент
|
|
3
|
+
* @author Vlad Firsov
|
|
4
|
+
*/
|
|
5
|
+
export * from './api';
|
|
6
|
+
export * from './core';
|
|
7
|
+
export * from './react';
|
|
8
|
+
export * from './reactive';
|
|
9
|
+
export * from './utils';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,OAAO,CAAA;AACrB,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1,17 @@
|
|
|
1
|
-
var pe={debug:(n,...e)=>{process.env.NODE_ENV},log:(n,...e)=>{process.env.NODE_ENV},info:(n,...e)=>{},warn:(n,...e)=>{},error:(n,...e)=>{}};function ge(n){return`${n?`${n}|`:""}${Math.random().toString(36).substring(2,9)+Date.now().toString(36)}`}function he(n){let e={};return n.forEach((t,s)=>{e[s.toLowerCase()]=t}),e}function U(n={},e={}){return{...n,...e,getFromStorage:n.getFromStorage||(t=>{try{let s=localStorage.getItem(t);return s?JSON.parse(s):void 0}catch{return}}),getCookie:n.getCookie||(t=>{try{let s=document.cookie.match(new RegExp(`(?:^|; )${t.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")}=([^;]*)`));return s?decodeURIComponent(s[1]):void 0}catch{return}})}}async function ye(n,e){let t=new Headers,s=e||U({},{});if(n)try{t=await Promise.resolve(n(t,s))}catch{}return t}function fe(n,e){return async(t,s)=>{let r=new Headers(t);if(n)try{r=await Promise.resolve(n(r,s))}catch{}if(e)try{r=await Promise.resolve(e(r,s))}catch{}return r}}var V=(a=>(a.Json="json",a.Blob="blob",a.ArrayBuffer="arrayBuffer",a.Text="text",a.FormData="formData",a.Raw="raw",a))(V||{});function Se(n){let e=n.toLowerCase().split(";")[0].trim();if(e.includes("application/json"))return"json";if(e.includes("text/"))return"text";if(e.includes("multipart/form-data"))return"formData";if(e.includes("application/octet-stream")||e.includes("application/pdf")||e.includes("image/")||e.includes("audio/")||e.includes("video/"))return"blob"}function te(n){let e=n.get("content-type")||"",t=n.get("content-disposition")||"",s=e.includes("application/octet-stream")||e.includes("application/pdf")||e.includes("image/")||e.includes("audio/")||e.includes("video/"),r=t.includes("attachment")||t.includes("filename=");return s||r}function ke(n){let e=n.get("content-disposition");if(!e)return;let t=e.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);if(t&&t[1])return t[1].replace(/['"]/g,"").trim()}function me(n){let e=n.get("content-type")||"",t=n.get("content-disposition")||"",s=n.get("content-length");return te(n)?{filename:ke(n),contentType:e,contentDisposition:t,size:s?parseInt(s,10):void 0}:void 0}async function Ue(n,e){let t=e,s=n.headers.get("content-type")||"";!t&&s&&(te(n.headers)?t="blob":t=Se(s)),t||(t="json");try{let r;switch((t==="blob"||t==="arrayBuffer")&&(r=me(n.headers)),t){case"json":try{let a=await n.json();return n.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}catch{let i=await n.text();return n.ok?{data:i,fileMetadata:r}:{error:i,fileMetadata:r}}case"text":{let a=await n.text();return n.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}case"blob":{let a=await n.blob();return n.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}case"arrayBuffer":{let a=await n.arrayBuffer();return n.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}case"formData":{let a=await n.formData();return n.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}case"raw":return n.ok?{data:n,fileMetadata:r}:{error:n,fileMetadata:r};default:let o=await n.blob();return n.ok?{data:o,fileMetadata:r}:{error:o,fileMetadata:r}}}catch(r){return n.ok?{data:void 0}:{error:r}}}function Te(n){let{baseUrl:e,timeout:t=3e4,fetchFn:s=fetch,credentials:r="same-origin"}=n;return async(o,a={},i)=>{let{path:c,method:d,body:l,query:u,responseFormat:p}=o,{signal:g,timeout:h=t,responseFormat:y}=a,E=y||p,S=new URL(c.startsWith("http")?c:`${e}${c}`);u&&Object.entries(u).forEach(([m,b])=>{b!=null&&(Array.isArray(b)?b.forEach(x=>S.searchParams.append(m,String(x))):S.searchParams.append(m,String(b)))});let f;if(l!==void 0)if(l instanceof FormData||l instanceof Blob)f=l;else if(typeof l=="object"&&l!==null)try{f=JSON.stringify(l),i.has("Content-Type")||i.set("Content-Type","application/json")}catch{f=String(l)}else f=String(l);let R,w=new Promise((m,b)=>{h&&(R=window.setTimeout(()=>{b(new Error(`\u041F\u0440\u0435\u0432\u044B\u0448\u0435\u043D\u043E \u0432\u0440\u0435\u043C\u044F \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u0437\u0430\u043F\u0440\u043E\u0441\u0430 (${h}\u043C\u0441)`))},h))});try{let m=s(S.toString(),{method:d,headers:i,body:f,signal:g,credentials:r}),b=await Promise.race([m,w]),{data:x,error:ee,fileMetadata:Ne}=await Ue(b,E);return{data:x,error:ee,ok:b.ok,status:b.status,statusText:b.statusText,headers:b.headers,fileDownloadResult:Ne}}catch(m){let b=m;return{error:b,ok:!1,status:0,statusText:b.message,headers:new Headers}}finally{R&&window.clearTimeout(R)}}}function be(n,e=[]){let t={};return!n||e.length===0||e.forEach(s=>{n.has(s)&&(t[s]=n.get(s)||"")}),t}var j=class{constructor(e,t,s,r,o,a){this.name=e;this.queryStorage=t;this.configCurrentEndpoint=s;this.cacheableHeaderKeys=r;this.globalCacheConfig=o;this.baseQueryConfig=a;this.prepareHeaders=fe(a.prepareHeaders,s.prepareHeaders),this.queryFunction=Te({baseUrl:a.baseUrl,fetchFn:a.fetchFn,timeout:a.timeout,credentials:a.credentials}),this.cacheableHeaders=[...r||[],...s.includeCacheableHeaderKeys||[]].filter(i=>!s.excludeCacheableHeaderKeys?.includes(i)),this.meta.name=e,this.meta.tags=s.tags??this.meta.tags,this.meta.invalidatesTags=s.invalidatesTags??this.meta.invalidatesTags,this.meta.cache=this.queryStorage.createCacheConfig(this.configCurrentEndpoint)??this.meta.cache}endpointSubscribers=new Set;fetchCounts=0;meta={cache:!1,invalidatesTags:[],name:"",tags:[]};queryFunction;cacheableHeaders;prepareHeaders;request(e,t){this.fetchCounts++;let s=ge(this.name),r=new AbortController,o=new Set,a={status:"idle",requestParams:e,headers:{},error:void 0,data:void 0,fromCache:!1},i=U({requestParams:e},t?.context||{}),c=l=>{Object.assign(a,l),o.forEach(u=>{u({...a})})},d=new Promise(async(l,u)=>{try{let p=await ye(this.prepareHeaders,i),g=be(p,t?.cacheableHeaderKeys?t.cacheableHeaderKeys:this.cacheableHeaders),h=this.queryStorage.shouldCache(this.configCurrentEndpoint,t),[y,E]=this.queryStorage.createCacheKey(this.name,{...e,...g}),S;if(h&&(S=await this.queryStorage.getCachedResult(y)),S)c({fromCache:!0,status:"success",data:S.data,error:void 0,headers:S.headers,requestParams:e}),l({...S,fromCache:!0});else{c({fromCache:!1,status:"loading"});let f=this.configCurrentEndpoint.request(e,t?.context),R={...t,signal:r.signal},w=await this.queryFunction(f,R,p);if(w.ok){let{headers:m,...b}=w;if(this.configCurrentEndpoint.invalidatesTags?.length&&await this.queryStorage.invalidateCacheByTags(this.configCurrentEndpoint.invalidatesTags),h){let x=this.queryStorage.createCacheConfig(this.configCurrentEndpoint);await this.queryStorage.setCachedResult(y,{...b,headers:he(m)},x,E??{},this.configCurrentEndpoint.tags??[])}c({fromCache:!1,status:"success",data:w.data,error:void 0,headers:w.headers,requestParams:e}),this.endpointSubscribers.forEach(x=>{let ee={status:"success",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:void 0};x(ee)}),l({...w,fromCache:!1})}else c({fromCache:!1,status:"error",data:void 0,error:w.error,headers:w.headers,requestParams:e}),this.endpointSubscribers.forEach(m=>{let b={status:"error",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:w.error};m(b)}),u(w.error)}}catch(p){c({fromCache:!1,status:"error",data:void 0,error:p,headers:void 0,requestParams:e}),u(p)}});return{id:s,subscribe(l,u={}){let{autoUnsubscribe:p=!0}=u;o.add(l),l(a);let g=()=>o.delete(l);return p&&d.finally(()=>{g()}),g},wait:()=>d,waitWithCallbacks(l={}){let{idle:u,loading:p,success:g,error:h}=l;return this.subscribe(y=>{switch(y.status){case"idle":u?.(y);break;case"loading":p?.(y);break;case"success":g?.(y.data,y);break;case"error":h?.(y.error,y);break}},{autoUnsubscribe:!0}),d},abort:()=>{r&&!r.signal.aborted&&r.abort()},then:(l,u)=>d.then(l,u),catch:l=>d.catch(l),finally:l=>d.finally(l)}}subscribe(e){this.endpointSubscribers.add(e);let t={status:"idle",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:void 0};return e(t),()=>this.endpointSubscribers.delete(e)}reset(){return this.fetchCounts=0,Promise.resolve()}destroy(){this.endpointSubscribers.clear()}};var T=class{constructor(e,t=!1){this.value=e;this.isRawKey=t}toString(){return this.value}toJSON(){return this.value}valueOf(){return this.value}isUnparseable(){return this.isRawKey}};var D=class{static createMetadata(e=0,t=[]){let s=Date.now(),r=e>0?s+e:1/0;return{createdAt:s,updatedAt:s,expiresAt:r,tags:t,createdAtDateTime:this.formatDateTime(s),updatedAtDateTime:this.formatDateTime(s),expiresAtDateTime:r===1/0?"never":this.formatDateTime(r)}}static formatDateTime(e){return new Date(e).toISOString()}static isExpired(e){return Date.now()>e.expiresAt}static updateMetadata(e){return{...e,updatedAt:Date.now()}}static createKey(...e){return new T(e.join("_"))}static createApiKey(e,t){if(!t)return[new T(e,!0),t];let s=Object.entries(t).sort(([r],[o])=>r.localeCompare(o)).map(([r,o])=>`${r}=${o}`).join("&");return[new T(`${e}_${s}`,!0),t]}static hasAnyTag(e,t=[]){return!e.tags||!t.length?!1:t.some(s=>e.tags?.includes(s))}};var H=class{constructor(e,t){this.storageExternal=e;this.globalCacheConfig=t}storage=null;cleanupInterval=null;defaultCacheOptions={ttl:5*60*1e3,cleanup:{enabled:!0,interval:10*60*1e3},invalidateOnError:!0};async initialize(){return await this.createStorage(),this.startCleanupInterval(),this}async createStorage(){try{let e=this.storageExternal;await e.initialize(),this.storage=e}catch(e){throw e}}startCleanupInterval(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null);let e=typeof this.globalCacheConfig=="object"?this.globalCacheConfig.cleanup:this.defaultCacheOptions.cleanup;e?.enabled&&e.interval&&(this.cleanupInterval=setInterval(()=>{this.cleanup().catch(t=>{})},e.interval))}getStorage(){return this.storage}createCacheKey(e,t){return D.createApiKey(e,t)}async getCachedResult(e){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let t=await this.storage.get(e);if(!t)return;if(D.isExpired(t.metadata)){await this.storage.delete(e);return}let s={...t,metadata:D.updateMetadata(t.metadata)};return await this.storage.set(e,s),t.data}async setCachedResult(e,t,s,r,o){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let a=D.createMetadata(s.ttl,o),i={data:t,metadata:a,params:r};await this.storage.set(e,i)}shouldCache(e,t){return!(this.globalCacheConfig===!1||e?.cache===!1||typeof e?.cache=="object"&&e?.cache.ttl===0||t?.disableCache===!0||this.globalCacheConfig===void 0&&e?.cache===void 0)}createCacheConfig(e){let t=this.defaultCacheOptions;if(typeof this.globalCacheConfig=="object"&&(t=this.globalCacheConfig),typeof e?.cache=="object"){let s=e.cache;t={...t,...s}}return t}async invalidateCacheByTags(e){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let t=await this.storage.keys();for(let s of t){let r=await this.storage.get(s);r&&D.hasAnyTag(r.metadata,e)&&await this.storage.delete(s)}}async invalidateCache(e){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");await this.storage.delete(e)}async cleanup(){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let e=await this.storage.keys();for(let t of e){let s=await this.storage.get(t);s&&D.isExpired(s.metadata)&&await this.storage.delete(t)}}async destroy(){this.cleanupInterval&&(window.clearInterval(this.cleanupInterval),this.cleanupInterval=null),this.storage&&(await this.storage.destroy(),this.storage=null)}};var we=class{queryStorage;cacheableHeaderKeys;globalCacheConfig;baseQueryConfig;storageExternal;createEndpoints;endpoints={};constructor(e){this.cacheableHeaderKeys=e.cacheableHeaderKeys,this.globalCacheConfig=e.cache,this.baseQueryConfig=e.baseQuery,this.storageExternal=e.storage,this.createEndpoints=e.endpoints}async init(){return this.queryStorage=await new H(this.storageExternal,this.globalCacheConfig).initialize(),await this.initializeEndpoints(),this}async initializeEndpoints(){let e=s=>s,t=await this.createEndpoints(e)||{};for(let[s,r]of Object.entries(t)){let o=s;this.endpoints[o]=new j(s,this.queryStorage,r,this.cacheableHeaderKeys,this.globalCacheConfig,this.baseQueryConfig)}}getEndpoints(){return this.endpoints}async request(e,t,s){let o=this.getEndpoints()[e];if(!o)throw new Error(`\u042D\u043D\u0434\u043F\u043E\u0438\u043D\u0442 ${String(e)} \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D`);try{return await o.request(t,s).wait()}catch(a){throw pe.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u043A ${String(e)}`,{error:a,params:t}),a}}async destroy(){await Promise.all(Object.values(this.endpoints).map(async e=>(e.destroy(),Promise.resolve()))),this.endpoints={},await this.queryStorage.destroy()}};var v=!1,$=new Map;function Ee(n){let e=0;if(n.length===0)return e.toString(36);for(let t=0;t<n.length;t++){let s=n.charCodeAt(t);e=(e<<5)-e+s,e=e&e}return Math.abs(e).toString(36).substring(0,6)}function I(n,e){if(n===e)return!0;if(n==null||e==null)return!1;if(typeof n!="object"&&typeof n!="function"&&typeof e!="object"&&typeof e!="function")return n===e;if(typeof n!=typeof e)return!1;if(n instanceof Date&&e instanceof Date)return n.getTime()===e.getTime();if(Array.isArray(n)&&Array.isArray(e)){if(n.length!==e.length)return!1;for(let t=0;t<n.length;t++)if(!I(n[t],e[t]))return!1;return!0}if(typeof n=="object"&&typeof e=="object"){let t=Object.keys(n),s=Object.keys(e);return t.length!==s.length?!1:t.every(r=>Object.prototype.hasOwnProperty.call(e,r)?I(n[r],e[r]):!1)}return!1}function ve(n,e=I){let t,s,r=!1;return function(a){if(!r||t!==a){let i=n(a);(!r||!e(i,s))&&(s=i),t=a,r=!0}return s}}var L=class{constructor(e,t,s=I,r){this.name=e;this.equals=s;this.logger=r;this.id=e,this.memoizedGetState=this.createMemoizedGetState(t)}id;subscribers=new Set;lastValue;memoizedGetState;createMemoizedGetState(e){let t=null,s=!1;return async()=>{if(s&&t)return t;s=!0;try{return t=e(),await t}finally{s=!1}}}async notify(){try{let e=await this.memoizedGetState();if(this.lastValue===void 0||!this.equals(e,this.lastValue)){this.lastValue=e;let t=Array.from(this.subscribers).map(async s=>{try{await s.notify(e)}catch(r){this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438 \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0430`,{error:r})}});await Promise.all(t)}}catch(e){throw this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 notify()`,{error:e}),e}}subscribe(e){return this.subscribers.add(e),this.lastValue!==void 0?Promise.resolve().then(()=>{try{e.notify(this.lastValue)}catch(t){this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438`,{error:t})}}):this.notify().catch(t=>{this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438`,{error:t})}),()=>{this.subscribers.delete(e)}}cleanup(){this.subscribers.clear(),this.lastValue=void 0}getId(){return this.id}},z=class{constructor(e,t){this.source=e;this.logger=t;this.storageName=e.name,this.source.getState().then(s=>{this.cachedState=s})}storageName;subscriptions=new Map;cachedState;localSelectorCache=new Map;batchUpdateInProgress=!1;pendingUpdates=new Set;generateName(e,t,s){let r=e?"simple":"combined",o="";if(e){let a=t.toString();o=Ee(a)}else{let a=t.map(c=>c.getId()).join("_"),i=s.toString();o=Ee(a+i)}return`${this.storageName}_${r}_${o}`}processPendingUpdates(){this.pendingUpdates.size===0||this.batchUpdateInProgress||(this.batchUpdateInProgress=!0,setTimeout(async()=>{try{let e=Array.from(this.pendingUpdates);this.pendingUpdates.clear(),this.cachedState=await this.source.getState();let t=e.map(async s=>{let r=this.subscriptions.get(s);if(r)try{return await r.notify()}catch(o){this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0430 ${s}`,{error:o})}return Promise.resolve()});await Promise.all(t)}catch(e){this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u043E\u0436\u0438\u0434\u0430\u044E\u0449\u0438\u0445 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0439",{error:e})}finally{this.batchUpdateInProgress=!1,this.pendingUpdates.size>0&&this.processPendingUpdates()}},0))}createSelector(e,t,s){let r=!Array.isArray(e),o=r?t||{}:s||{},a=o.name||this.generateName(r,e,r?void 0:t);if(this.localSelectorCache.has(a))return this.localSelectorCache.get(a).api;if($.has(a)){let l=$.get(a);return l.refCount++,l.api}let i,c,d=[];if(r){let l=ve(e,o.equals||I),u=this.createSimpleSelector(l,{...o,name:a,equals:o.equals||I});i=u.api,d=u.unsubscribeFunctions}else{c=e;let l=this.createCombinedSelector(c,t,{...o,name:a,equals:o.equals||I});i=l.api,d=l.unsubscribeFunctions}return this.localSelectorCache.set(a,{api:i,dependencies:c,unsubscribeFunctions:d}),$.set(a,{api:i,refCount:1,unsubscribeFunctions:d}),i}createSimpleSelector(e,t){let s=async()=>{if(this.cachedState)return e(this.cachedState);let c=await this.source.getState();return this.cachedState=c,e(c)},r=new L(t.name,s,t.equals||I,this.logger),o=r.getId();this.subscriptions.set(o,r);let i=[this.source.subscribeToAll(async c=>{c?.type==="storage:update"&&(this.pendingUpdates.add(o),this.processPendingUpdates())})];return{api:{select:()=>s(),subscribe:c=>r.subscribe(c),getId:()=>o},unsubscribeFunctions:i}}createCombinedSelector(e,t,s){let r=ve(u=>t(...u),s.equals||I),o=async()=>{let u=await Promise.all(e.map(p=>p.select()));return r(u)},a=new L(s.name,o,s.equals||I,this.logger),i=a.getId();this.subscriptions.set(i,a);let c=null,d=()=>{c!==null&&clearTimeout(c),c=setTimeout(()=>{c=null,a.notify().catch(u=>this.logger?.error(`[${i}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0435\u043D\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438:`,{error:u}))},10)},l=e.map(u=>u.subscribe({notify:()=>{d()}}));return{api:{select:()=>o(),subscribe:u=>a.subscribe(u),getId:()=>i},unsubscribeFunctions:l}}destroy(){this.subscriptions.forEach(t=>t.cleanup()),this.subscriptions.clear(),this.cachedState=void 0,this.pendingUpdates.clear(),this.localSelectorCache.forEach(t=>{t.unsubscribeFunctions.forEach(s=>s())});let e=new Set;this.localSelectorCache.forEach((t,s)=>{e.add(s)}),this.localSelectorCache.clear(),e.forEach(t=>{let s=$.get(t);s&&(s.refCount--,s.refCount<=0&&(s.unsubscribeFunctions.forEach(r=>r()),$.delete(t)))})}};var Re=class{constructor(e,t,s="default"){this.parentExecutor=e;this.logger=t;this.storageName=s}plugins=new Map;createContext(e){return{storageName:this.storageName,timestamp:Date.now(),metadata:e}}async add(e){if(this.plugins.has(e.name)){this.logger?.warn(`\u041F\u043B\u0430\u0433\u0438\u043D ${e.name} \u0443\u0436\u0435 \u0431\u044B\u043B \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D`);return}try{await e.initialize?.(),this.plugins.set(e.name,e),this.logger?.info("\u041F\u043B\u0430\u0433\u0438\u043D \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D",{name:e.name})}catch(t){throw t}}async remove(e){let t=this.plugins.get(e);t&&(await t.destroy?.(),this.plugins.delete(e),this.logger?.info("\u041F\u043B\u0430\u0433\u0438\u043D \u0443\u0434\u0430\u043B\u0435\u043D",{name:e}))}get(e){return this.plugins.get(e)}getAll(){return Array.from(this.plugins.values())}async initialize(){for(let e of this.plugins.values())await e.initialize?.()}async destroy(){await Promise.all(Array.from(this.plugins.values()).map(e=>e.destroy?.()??Promise.resolve())),this.plugins.clear()}async executeBeforeSet(e,t){let s=e,r=this.createContext(t);this.parentExecutor&&(s=await this.parentExecutor.executeBeforeSet(s,r));for(let o of this.plugins.values())if(o.onBeforeSet)try{s=await o.onBeforeSet(s,r)}catch(a){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${o.name} onBeforeSet`,{error:a}),a}return s}async executeAfterSet(e,t,s){let r=t,o=this.createContext(s);this.parentExecutor&&(r=await this.parentExecutor.executeAfterSet(e,r,o));for(let a of this.plugins.values())if(a.onAfterSet)try{r=await a.onAfterSet(e,r,o)}catch(i){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${a.name} onAfterSet`,{key:e,error:i}),i}return r}async executeBeforeGet(e,t){let s=e,r=this.createContext(t);this.parentExecutor&&(s=await this.parentExecutor.executeBeforeGet(s,r));for(let o of this.plugins.values())if(o.onBeforeGet)try{s=await o.onBeforeGet(s,r)}catch(a){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${o.name} onBeforeGet`,{key:e,error:a}),a}return s}async executeAfterGet(e,t,s){let r=t,o=this.createContext(s);this.parentExecutor&&(r=await this.parentExecutor.executeAfterGet(e,r,o));for(let a of this.plugins.values())if(a.onAfterGet)try{r=await a.onAfterGet(e,r,o)}catch(i){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${a.name} onAfterGet`,{key:e,error:i}),i}return r}async executeBeforeDelete(e,t){let s=!0,r=this.createContext(t);this.parentExecutor&&(s=await this.parentExecutor.executeBeforeDelete(e,r));for(let o of this.plugins.values())if(o.onBeforeDelete)try{s=await o.onBeforeDelete(e,r)&&s}catch(a){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${o.name} onBeforeDelete`,{key:e,error:a}),a}return s}async executeAfterDelete(e,t){let s=this.createContext(t);this.parentExecutor&&await this.parentExecutor.executeAfterDelete(e,s);for(let r of this.plugins.values())if(r.onAfterDelete)try{await r.onAfterDelete(e,s)}catch(o){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${r.name} onAfterDelete`,{key:e,error:o}),o}}async executeOnClear(e){let t=this.createContext(e);this.parentExecutor&&await this.parentExecutor.executeOnClear(t);for(let s of this.plugins.values())if(s.onClear)try{await s.onClear(t)}catch(r){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${s.name} onClear`,{error:r}),r}}};var xe=(r=>(r.IDLE="idle",r.LOADING="loading",r.READY="ready",r.ERROR="error",r))(xe||{}),re=(a=>(a.STORAGE_UPDATE="storage:update",a.STORAGE_DELETE="storage:delete",a.STORAGE_PATCH="storage:patch",a.STORAGE_SELECT="storage:select",a.STORAGE_CLEAR="storage:clear",a.STORAGE_DESTROY="storage:destroy",a))(re||{});var _=class{channel;tabId;messageHandlers;syncHandler;debug;syncTimeoutMs=1e3;pendingSyncRequests;constructor(e,t={}){this.channel=new BroadcastChannel(e),this.tabId=crypto.randomUUID(),this.messageHandlers=new Set,this.debug=t.debug??!1,this.pendingSyncRequests=new Map,this.channel.onmessage=this.handleMessage.bind(this),this.channel.onmessageerror=this.handleError.bind(this)}log(...e){this.debug}error(...e){}async handleMessage(e){let t=e.data;if(t.senderId!==this.tabId){if(t.type==="SYNC_REQUEST"){if(this.syncHandler)try{let s=await this.syncHandler();this.postMessage("SYNC_RESPONSE",s,t.senderId)}catch(s){this.error("Error handling sync request:",s)}return}if(t.type==="SYNC_RESPONSE"){let s=this.pendingSyncRequests.get(this.tabId);s&&(clearTimeout(s.timeout),this.pendingSyncRequests.delete(this.tabId),s.resolve(t.payload));return}for(let s of this.messageHandlers)try{await s(t)}catch(r){this.error("Error in message handler:",r)}}}handleError(e){this.error("Channel error:",e)}postMessage(e,t,s){let r={type:e,payload:t,senderId:this.tabId,timestamp:Date.now()};this.channel.postMessage(r)}subscribe(e){return this.messageHandlers.add(e),()=>this.messageHandlers.delete(e)}setSyncHandler(e){this.syncHandler=e}broadcast(e,t){this.postMessage(e,t)}async requestSync(){return new Promise((e,t)=>{let s=setTimeout(()=>{this.pendingSyncRequests.delete(this.tabId),e(null)},this.syncTimeoutMs);this.pendingSyncRequests.set(this.tabId,{resolve:e,reject:t,timeout:s}),this.postMessage("SYNC_REQUEST",{type:"sync"})})}close(){for(let[,e]of this.pendingSyncRequests)clearTimeout(e.timeout),e.reject(new Error("Channel closed"));this.pendingSyncRequests.clear(),this.messageHandlers.clear(),this.syncHandler=void 0,this.channel.close()}};async function Ve(n,e,t){switch(e){case"set":t?.key!==void 0&&t?.value!==void 0&&(await n.storage.doSet(t.key,t.value),n.storage.notifySubscribers(t.key,t.value));break;case"update":Array.isArray(t?.value)&&(await n.storage.doUpdate(t.value),t.value.forEach(({key:s,value:r})=>{n.storage.notifySubscribers(s,r)}));break;case"delete":t?.key!==void 0&&(await n.storage.doDelete(t.key),n.storage.notifySubscribers(t.key,void 0));break;case"clear":await n.storage.doClear(),n.storage.notifySubscribers("*",{type:"storage:update",value:{},source:"broadcast"});break}n.storage.notifySubscribers("*",{type:"storage:update",key:t?.key,value:t?.value,source:"broadcast"})}async function je(n,e,t){switch(e){case"set":if(t?.key!==void 0){let s=await n.storage.doGet(t.key);n.storage.notifySubscribers(t.key,s)}break;case"update":if(Array.isArray(t?.value)){for(let{key:s}of t.value){let r=await n.storage.doGet(s);n.storage.notifySubscribers(s,r)}n.storage.notifySubscribers("*",{type:"storage:update",key:t.value.map(({key:s})=>s),value:t.value,source:"broadcast"})}break;case"delete":t?.key!==void 0&&n.storage.notifySubscribers(t.key,void 0);break;case"clear":n.storage.notifySubscribers("*",{type:"storage:update",value:{},source:"broadcast"});break}e!=="update"&&n.storage.notifySubscribers("*",{type:"storage:update",key:t?.key,value:e==="delete"?void 0:t?.value,source:"broadcast"})}var Pe=n=>{let{storageName:e,storageType:t}=n,s=`${t}-${e}`,r=new _(s,{debug:!0});return{name:"broadcast",setup:o=>(t==="memory"&&(r.setSyncHandler(async()=>{let a=await o.getState();return{type:"update",key:"*",value:Object.entries(a).map(([d,l])=>({key:d,value:l})),metadata:{batchUpdate:!0,timestamp:Date.now()}}}),r.requestSync().then(async a=>{if(a?.type==="update"&&Array.isArray(a.value))try{if(!a.value.every(c=>c&&typeof c=="object"&&"key"in c&&"value"in c))return;await o.storage.doUpdate(a.value),a.value.forEach(({key:c,value:d})=>{o.storage.notifySubscribers(c,d)}),o.storage.notifySubscribers("*",{type:"storage:update",value:a.value,source:"broadcast"})}catch{}})),r.subscribe(async a=>{let{type:i,payload:c}=a;t==="memory"?await Ve(o,i,c):await je(o,i,c)})),reducer:o=>a=>async i=>{let c=await a(i);return["set","delete","clear","update"].includes(i.type)&&r.broadcast(i.type,i),c},cleanup:()=>{r.close()}}};var Ae=(n={})=>{let e=n.batchSize??10,t=n.batchDelay??10,s=new Map,r=new Map,o=p=>p.type==="set"||p.type==="update",a=p=>`${p.type}_${p.key?.toString()||"default"}`,i=p=>{let g=new Map;for(let h of p){let y=`${h.type}_${h.key?.toString()||"default"}`;g.set(y,h)}return Array.from(g.values())},c=p=>{let g=r.get(p);g&&(globalThis.clearTimeout(g),r.delete(p))},d=(p,g)=>{let h=globalThis.setTimeout(g,t);r.set(p,h)},l=async(p,g,h)=>{let y=s.get(p);if(!(!y||y.length===0)){s.delete(p),c(p);try{let E=y.map(f=>f.action),S=i(E);for(let f of S)try{let R=await h(f);y.filter(m=>m.action.type===f.type&&m.action.key?.toString()===f.key?.toString()).forEach(m=>m.resolve(R))}catch(R){y.filter(m=>m.action.type===f.type&&m.action.key?.toString()===f.key?.toString()).forEach(m=>m.reject(R))}}catch(E){y.forEach(S=>S.reject(E))}}},u=async(p,g,h)=>new Promise((y,E)=>{let S=a(p),f=s.get(S);f||(f=[],s.set(S,f)),f.push({action:p,resolve:y,reject:E,timestamp:Date.now()}),c(S),f.length>=e?setImmediate(()=>l(S,g,h)):d(S,()=>l(S,g,h))});return{name:"batching",setup:()=>{},cleanup:async()=>{r.forEach(p=>globalThis.clearTimeout(p)),r.clear(),s.clear()},reducer:p=>g=>async h=>o(h)?u(h,p,g):g(h)}};var Ce=(n={})=>{let{comparator:e=(r,o)=>{if(r===o)return!0;if(typeof r!="object"||typeof o!="object"||r===null||o===null)return r===o;let a=Object.keys(r),i=Object.keys(o);return a.length!==i.length?!1:a.every(c=>Object.prototype.hasOwnProperty.call(o,c)&&r[c]===o[c])},segments:t=[]}=n,s=new Map;return{name:"shallow-compare",setup:r=>{},reducer:r=>o=>async a=>{if(a.type!=="set"||t.length&&!t.includes(a.metadata?.segment??"default"))return o(a);let i=a.key,c=s.get(i),d=a.value;if(c!==void 0&&e(c,d))return{...c,t:{valueNotChanged:!0,originalValue:c}};let l=await o(a);return s.set(i,d),l}}};var W=class{middlewares=[];api;initialized=!1;dispatchFn;constructor(e){this.api={dispatch:async t=>this.dispatch(t),getState:()=>e.getState(),storage:{doGet:e.doGet.bind(e),doSet:e.doSet.bind(e),doUpdate:e.doUpdate.bind(e),doDelete:e.doDelete.bind(e),doClear:e.doClear.bind(e),doKeys:e.doKeys.bind(e),notifySubscribers:e.notifySubscribers.bind(e)}}}async baseOperation(e){let{processed:t,...s}=e.metadata||{},r={...e,metadata:s};switch(r.type){case"get":return this.api.storage.doGet(r.key);case"set":return await this.api.storage.doSet(r.key,r.value),this.api.storage.doGet(r.key);case"update":return Array.isArray(r.value)?(await this.api.storage.doUpdate(r.value),this.api.storage.doGet("")):r.value;case"delete":return this.api.storage.doDelete(r.key);case"clear":return this.api.storage.doClear();case"init":{let o=await this.api.storage.doGet("");return Object.keys(o||{}).length>0?o:r.value?(await this.api.storage.doSet("",r.value),this.api.storage.doGet("")):o}case"keys":return this.api.storage.doKeys();default:throw new Error(`Unknown action type: ${r.type}`)}}initializeMiddlewares(){if(this.initialized)return;let e=this.baseOperation.bind(this);for(let t of[...this.middlewares].reverse()){let s=e;e=async r=>{if(r.metadata?.processed)return s(r);let o={...r,metadata:{...r.metadata,processed:!0,timestamp:r.metadata?.timestamp||Date.now()}};return t.reducer(this.api)(s)(o)}}this.dispatchFn=e,this.initialized=!0}use(e){e.setup&&e.setup(this.api),this.middlewares.push(e),this.initialized=!1}async dispatch(e){this.initialized||this.initializeMiddlewares();try{return this.dispatchFn(e)}catch(t){throw t}}};function A(n){return n instanceof T&&n.isUnparseable()?[n.toString()]:n.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function C(n,e){return A(e).reduce((s,r)=>s===void 0?void 0:s[r],n)}function O(n,e,t){if(e==="")return t;let s=A(e);if(e instanceof T&&e.isUnparseable())return n[e.toString()]=t,n;let r=s.pop(),o=s.reduce((a,i)=>{let c=s[s.indexOf(i)+1],d=!Number.isNaN(Number(c));return i in a||(a[i]=d?[]:{}),a[i]},n);return o[r]=t,n}var M=class n{constructor(e,t,s,r){this.config=e;this.pluginExecutor=t;this.eventEmitter=s;this.logger=r;this.name=e.name,this.middlewareModule=new W({getState:this.getState.bind(this),doGet:this.doGet.bind(this),doSet:this.doSet.bind(this),doUpdate:this.doUpdate.bind(this),doDelete:this.doDelete.bind(this),doClear:this.doClear.bind(this),doKeys:this.doKeys.bind(this),notifySubscribers:this.notifySubscribers.bind(this),pluginExecutor:this.pluginExecutor,eventEmitter:this.eventEmitter,logger:this.logger}),this.initializeMiddlewares()}static GLOBAL_SUBSCRIPTION_KEY="*";name;e={status:"idle"};statusSubscribers=new Set;selectorPathCache=new WeakMap;middlewareModule;initializedMiddlewares=null;subscribers=new Map;get initStatus(){return{...this.e}}async waitForReady(){if(this.e.status==="ready")return this;if(this.e.status==="error")throw this.e.error||new Error("Storage initialization failed");return new Promise((e,t)=>{let s=this.onStatusChange(r=>{r.status==="ready"?(s(),e(this)):r.status==="error"&&(s(),t(r.error||new Error("Storage initialization failed")))})})}onStatusChange(e){return this.statusSubscribers.add(e),e(this.initStatus),()=>{this.statusSubscribers.delete(e)}}updateInitStatus(e){let t=this.e.status;this.e={...this.e,...e},t!==this.e.status&&this.logger?.debug(`Storage "${this.name}" status changed: ${t} -> ${this.e.status}`);let s=this.initStatus;this.statusSubscribers.forEach(r=>{try{r(s)}catch(o){this.logger?.error("Error in status change callback",{error:o})}})}async initialize(){if(this.e.status==="ready")return this;if(this.e.status==="loading")return this.waitForReady();this.updateInitStatus({status:"loading",error:void 0});try{let e=await this.doInitialize();return this.updateInitStatus({status:"ready",error:void 0}),e}catch(e){throw this.updateInitStatus({status:"error",error:e instanceof Error?e:new Error(String(e))}),e}}ensureReady(){if(this.e.status!=="ready")throw new Error(`Storage "${this.name}" is not ready. Current status: ${this.e.status}`)}initializeMiddlewares(){this.config.middlewares&&!this.initializedMiddlewares&&(this.initializedMiddlewares=this.config.middlewares(()=>this.getDefaultMiddleware()),this.initializedMiddlewares.forEach(e=>this.middlewareModule.use(e)))}getDefaultMiddleware(){return{batching:(e={})=>Ae(e),shallowCompare:(e={})=>Ce(e)}}async initializeWithMiddlewares(){try{let e=await this.getState();!(Object.keys(e).length>0)&&this.config.initialState&&await this.middlewareModule.dispatch({type:"init",value:this.config.initialState})}catch(e){throw this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430",{error:e}),e}}async get(e){this.ensureReady();try{let t={operation:"get",timestamp:Date.now(),key:e},s=await this.middlewareModule.dispatch({type:"get",key:e,metadata:t}),r=await this.pluginExecutor?.executeAfterGet(e,s,t)??s;return await this.emitEvent({type:"storage:select",payload:{key:e,value:r}}),r}catch(t){throw this.logger?.error("Error getting value",{key:e,error:t}),t}}async set(e,t){this.ensureReady();try{let s={operation:"set",timestamp:Date.now(),key:e},r=await this.pluginExecutor?.executeBeforeSet(t,s)??t,o=await this.middlewareModule.dispatch({type:"set",key:e,value:r,metadata:s}),a=o?.t?.valueNotChanged===!0,i;if(a&&o?.t?.originalValue!==void 0?i=o.t.originalValue:i=await this.pluginExecutor?.executeAfterSet(e,o,s)??o,!a){let d=[e.toString()];this.notifySubscribers(e,i),this.notifySubscribers(n.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:i,changedPaths:d}),await this.emitEvent({type:"storage:update",payload:{key:e,value:i,changedPaths:d}})}}catch(s){throw this.logger?.error("Error setting value",{key:e,error:s}),s}}async update(e){this.ensureReady();try{let t={operation:"update",timestamp:Date.now()},s=await this.getState(),r=structuredClone(s);e(r);let o=this.findChangedPaths(s,r);if(o.size===0){this.logger?.debug&&this.logger.debug("No changes detected in update");return}this.logger?.debug&&this.logger.debug("Changed paths:",{paths:Array.from(o)});let a=new Set;for(let p of o){let g=p.split(".")[0];a.add(g)}let i=await Promise.all(Array.from(a).map(async p=>{let g={...t,key:p},h=await this.pluginExecutor?.executeBeforeSet(r[p],g)??r[p];return{key:p,value:h}})),c=await this.middlewareModule.dispatch({type:"update",value:i,metadata:{...t,batchUpdate:!0,changedPaths:Array.from(o)}}),d={};Array.isArray(c)?c.forEach(p=>{p&&typeof p=="object"&&"key"in p&&"value"in p&&(d[p.key]=p.value)}):c&&typeof c=="object"&&(d={...c});let l=Object.keys(d).filter(p=>!this.isEqual(s[p],d[p]));if(l.length===0){this.logger?.debug&&this.logger.debug("No actual changes after middleware processing");return}let u={};l.forEach(p=>{u[p]=d[p]}),this.logger?.debug&&this.logger.debug("Notifying subscribers about changes:",{keys:l}),this.notifySubscribers(n.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:l,value:u,changedPaths:Array.from(o)});for(let p of o)try{let g=p.split(".")[0];if(g in u){let h;if(p===g)h=u[g];else{let y=p.substring(g.length+1);h=C(u[g],y)}h!==void 0&&this.notifySubscribers(p,h)}}catch(g){this.logger?.error("Error notifying path subscribers",{path:p,error:g})}await this.emitEvent({type:"storage:update",payload:{state:u,key:l,changedPaths:Array.from(o)}})}catch(t){throw this.logger?.error("Error updating state",{error:t}),t}}async delete(e){this.ensureReady();try{let t={operation:"delete",timestamp:Date.now(),key:e};if(await this.pluginExecutor?.executeBeforeDelete(e,t)===!1)return;let r=await this.middlewareModule.dispatch({type:"delete",key:e,metadata:t});if(r===!1)return;await this.pluginExecutor?.executeAfterDelete(e,t);let a=[e.toString()];this.notifySubscribers(e,void 0),this.notifySubscribers(n.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:void 0,result:r,changedPaths:a}),await this.emitEvent({type:"storage:update",payload:{key:e,value:void 0,result:r,changedPaths:a}})}catch(t){throw this.logger?.error("Error deleting value",{key:e,error:t}),t}}async clear(){this.ensureReady();try{this.pluginExecutor?.executeOnClear(),await this.middlewareModule.dispatch({type:"clear"})}catch(e){throw this.logger?.error("Error clearing storage",{error:e}),e}}async keys(){this.ensureReady();try{return await this.middlewareModule.dispatch({type:"keys"})}catch(e){throw this.logger?.error("Error getting keys",{error:e}),e}}async has(e){this.ensureReady();try{return await this.doHas(e)}catch(t){throw this.logger?.error("Error checking value existence",{key:e,error:t}),t}}async getState(){try{return await this.doGet("")||{}}catch(e){throw this.logger?.error("Error getting state",{error:e}),e}}subscribeToAll(e){return this.subscribers.has(n.GLOBAL_SUBSCRIPTION_KEY)||this.subscribers.set(n.GLOBAL_SUBSCRIPTION_KEY,new Set),this.subscribers.get(n.GLOBAL_SUBSCRIPTION_KEY).add(e),()=>{let t=this.subscribers.get(n.GLOBAL_SUBSCRIPTION_KEY);t&&(t.delete(e),t.size===0&&this.subscribers.delete(n.GLOBAL_SUBSCRIPTION_KEY))}}subscribe(e,t){return typeof e=="string"?this.subscribeByKey(e,t):this.subscribeBySelector(e,t)}async destroy(){try{await this.clear(),await this.doDestroy(),this.initializedMiddlewares&&(await Promise.all(this.initializedMiddlewares.map(async e=>{"cleanup"in e&&await e.cleanup?.()})),this.initializedMiddlewares=null),this.statusSubscribers.clear(),this.updateInitStatus({status:"idle"}),await this.emitEvent({type:"storage:destroy"})}catch(e){throw this.logger?.error("Error destroying storage",{error:e}),e}}subscribeByKey(e,t){this.subscribers.has(e)||this.subscribers.set(e,new Set);let s=!1;return this.subscribers.get(e).add(t),this.get(e).then(r=>{try{s||(s=!0,t(r))}catch(o){this.logger?.error("Error in initial callback",{key:e,error:o})}}),()=>{let r=this.subscribers.get(e);r&&(r.delete(t),r.size===0&&this.subscribers.delete(e))}}createDummyState(){let e={get:(t,s)=>(t[s]=t[s]||new Proxy({},e),t[s])};return new Proxy({},e)}isEqual(e,t){if(e===t)return!0;if(e==null||t==null)return e===t;let s=typeof e;if(s!==typeof t)return!1;if(s!=="object")return e===t;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(!this.isEqual(e[i],t[i]))return!1;return!0}let o=Object.keys(e),a=Object.keys(t);return o.length!==a.length?!1:o.every(i=>Object.prototype.hasOwnProperty.call(t,i)&&this.isEqual(e[i],t[i]))}extractPath(e,t){if(this.selectorPathCache.has(e))return this.selectorPathCache.get(e);let s=[],r=(o="")=>({get:(a,i)=>{if(typeof i=="symbol")return Reflect.get(a,i);let c=o?`${o}.${i}`:i;return s.push(c),new Proxy({},r(c))},has:(a,i)=>!0,ownKeys:()=>[],getOwnPropertyDescriptor:()=>({configurable:!0,enumerable:!0}),apply:(a,i,c)=>new Proxy(()=>{},r(o))});try{e(new Proxy(t,r()))}catch{}return s.length===0?"":(s.sort((o,a)=>a.length-o.length),this.selectorPathCache.set(e,s[0]),s[0])}notifySubscribers(e,t){let s=e.toString(),r=this.subscribers.get(s);r?.size&&new Set(r).forEach(a=>{try{a(t)}catch(i){this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0435 \u043D\u0430 \u043A\u043E\u043B\u0431\u044D\u043A",{key:s,error:i})}})}findChangedPaths(e,t,s="",r=new Set,o=new WeakMap){if(e===t)return r;if(typeof e!="object"||typeof t!="object"||e===null||t===null)return e!==t&&r.add(s||""),r;if(o.has(e))return r;o.set(e,!0);let a=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(let i of a){let c=e[i],d=t[i];if(c===d)continue;let l=s?`${s}.${i}`:i;c&&d&&typeof c=="object"&&typeof d=="object"&&!Array.isArray(c)&&!Array.isArray(d)?this.findChangedPaths(c,d,l,r,o):Array.isArray(c)&&Array.isArray(d)?this.isEqual(c,d)||r.add(l):this.isEqual(c,d)||r.add(l)}return r}subscribeBySelector(e,t){let s=this.createDummyState(),r=this.extractPath(e,s);this.logger?.debug&&this.logger.debug("Subscribing to path:",{path:r});let o=async a=>{try{if(a==null){let d=await this.getState(),l=e(d);t(l);return}if(typeof a!="object"||a===null){t(a);return}let i=await this.getState(),c=e(i);t(c)}catch(i){this.logger?.error("Error in selector callback",{path:r,error:i}),t(a)}};return r?this.subscribeByKey(r,o):this.subscribeToAll(()=>{this.getState().then(a=>{t(e(a))})})}async emitEvent(e){try{await this.eventEmitter?.emit({...e,metadata:{...e.metadata||{},timestamp:Date.now(),storageName:this.name}})}catch(t){this.logger?.error("Error emitting event",{event:e,error:t})}}};var se=class n{constructor(e,t,s){this.dbName=e;this.logger=s;this.dbVersion=t}static instances=new Map;db=null;initPromise=null;storeNames=new Set;dbVersion;static getInstance(e,t=1,s){n.instances.has(e)||n.instances.set(e,new n(e,t,s));let r=n.instances.get(e);return t>r.dbVersion&&(r.dbVersion=t),r}async initialize(){return this.db?this.db:(this.initPromise||(this.initPromise=this.openDatabase()),this.initPromise)}async ensureStoreExists(e){if(await this.initialize(),this.db.objectStoreNames.contains(e))return this.storeNames.add(e),this.db;this.logger?.debug(`Store "${e}" not found, upgrading database`,{dbName:this.dbName,currentStores:Array.from(this.db.objectStoreNames)}),this.db.close(),this.db=null,this.dbVersion++,this.initPromise=this.openDatabase([e]);let t=await this.initPromise;return this.storeNames.add(e),t}async openDatabase(e=[]){return new Promise((t,s)=>{this.logger?.debug(`Opening database "${this.dbName}" with version ${this.dbVersion}`);let r=indexedDB.open(this.dbName,this.dbVersion);r.onerror=()=>{this.logger?.error(`Failed to open database "${this.dbName}"`,{error:r.error}),s(r.error)},r.onsuccess=()=>{this.db=r.result;for(let o=0;o<this.db.objectStoreNames.length;o++)this.storeNames.add(this.db.objectStoreNames[o]);this.logger?.debug(`Database "${this.dbName}" opened successfully`,{version:this.db.version,stores:Array.from(this.db.objectStoreNames)}),t(this.db)},r.onupgradeneeded=o=>{let a=o.target.result;this.logger?.debug(`Upgrading database "${this.dbName}" to version ${this.dbVersion}`);for(let i of e)a.objectStoreNames.contains(i)||(this.logger?.debug(`Creating store "${i}"`),a.createObjectStore(i))}})}closeDatabase(){this.db&&(this.db.close(),this.db=null,this.initPromise=null)}async deleteDatabase(){return this.closeDatabase(),new Promise((e,t)=>{let s=indexedDB.deleteDatabase(this.dbName);s.onsuccess=()=>{this.logger?.debug(`Database "${this.dbName}" deleted successfully`),n.instances.delete(this.dbName),this.storeNames.clear(),e()},s.onerror=()=>{this.logger?.error(`Failed to delete database "${this.dbName}"`,{error:s.error}),t(s.error)}})}async ensureStoresExist(e){await this.initialize();let t=e.filter(s=>!this.db.objectStoreNames.contains(s));return t.length===0?this.db:(this.logger?.debug(`\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u044E\u0449\u0438\u0445 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449: ${t.join(", ")}`,{dbName:this.dbName,currentStores:Array.from(this.db.objectStoreNames)}),this.db.close(),this.db=null,this.dbVersion++,this.initPromise=this.openDatabase(t),this.initPromise)}getCurrentVersion(){return this.dbVersion}},ne=class{constructor(e,t=1,s){this.dbName=e;this.logger=s;this.version=t}db=null;version;getCurrentVersion(){return this.version}openDatabase(e,t=[]){return new Promise((s,r)=>{this.logger?.debug(`\u041E\u0442\u043A\u0440\u044B\u0442\u0438\u0435 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445 "${this.dbName}" \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 ${e}`);let o=indexedDB.open(this.dbName,e);o.onerror=()=>{this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445 "${this.dbName}"`,{error:o.error}),r(o.error)},o.onsuccess=()=>{this.db=o.result,this.version=this.db.version,this.logger?.debug(`\u0411\u0430\u0437\u0430 \u0434\u0430\u043D\u043D\u044B\u0445 "${this.dbName}" \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u0430`,{version:this.db.version,stores:Array.from(this.db.objectStoreNames)}),s(this.db)},o.onupgradeneeded=a=>{let i=a.target.result;this.logger?.debug(`\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445 "${this.dbName}" \u0434\u043E \u0432\u0435\u0440\u0441\u0438\u0438 ${e}`);for(let c of t)i.objectStoreNames.contains(c)||(this.logger?.debug(`\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430 "${c}"`),i.createObjectStore(c))}})}async ensureStoresExist(e){this.db||(this.db=await this.openDatabase(this.version));let t=e.filter(s=>!this.db.objectStoreNames.contains(s));return t.length===0?this.db:(this.logger?.debug(`\u041D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430: ${t.join(", ")}`,{dbName:this.dbName,currentVersion:this.version}),this.db.close(),this.db=null,this.version++,this.db=await this.openDatabase(this.version,t),this.db)}close(){this.db&&(this.db.close(),this.db=null)}},ae=class n extends M{DB_NAME;STORE_NAME;DB_VERSION;dbManager;constructor(e,t,s,r){super(e,t,s,r);let o=e.options;this.DB_NAME=o.dbName||"app_storage",this.STORE_NAME=e.name,this.DB_VERSION=o.dbVersion||1,this.dbManager=se.getInstance(this.DB_NAME,this.DB_VERSION,r)}async doInitialize(){try{if(this.logger?.debug(`Initializing IndexedDB storage "${this.STORE_NAME}"`),await this.dbManager.ensureStoreExists(this.STORE_NAME),!(await this.dbManager.initialize()).objectStoreNames.contains(this.STORE_NAME))throw new Error(`Store "${this.STORE_NAME}" not found after initialization`);return this.initializeMiddlewares(),await this.initializeWithMiddlewares(),this.logger?.debug(`IndexedDB storage "${this.STORE_NAME}" initialized successfully`),this}catch(e){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 IndexedDB "${this.name}"`,{error:e}),e}}static async getCurrentDBVersion(e){return new Promise(t=>{try{let s=indexedDB.open(e);s.onsuccess=()=>{let r=s.result.version;s.result.close(),t(r)},s.onerror=()=>{t(0)}}catch{t(0)}})}static async createStorages(e,t,s){let o=await this.getCurrentDBVersion(e)||1,a=new ne(e,o,s),i=Object.values(t).map(d=>d.name);await a.ensureStoresExist(i);let c={};for(let[d,l]of Object.entries(t)){let u=new n({...l,options:{dbName:e,dbVersion:a.getCurrentVersion()}},l.pluginExecutor,l.eventEmitter,s);c[d]=await u.initialize()}return c}async getTransaction(e="readonly"){try{let t=await this.dbManager.ensureStoreExists(this.STORE_NAME);if(!t.objectStoreNames.contains(this.STORE_NAME)){this.logger?.warn(`Object store "${this.STORE_NAME}" not found, attempting to repair`),t.close(),this.dbManager.closeDatabase();let s=await this.dbManager.ensureStoreExists(this.STORE_NAME);if(!s.objectStoreNames.contains(this.STORE_NAME))throw new Error(`Object store "${this.STORE_NAME}" still doesn't exist after repair attempt`);return s.transaction(this.STORE_NAME,e)}return t.transaction(this.STORE_NAME,e)}catch(t){throw this.logger?.error(`Failed to create transaction for store "${this.STORE_NAME}"`,{error:t}),t}}async getObjectStore(e="readonly"){return(await this.getTransaction(e)).objectStore(this.STORE_NAME)}async doGet(e){let t=await this.getObjectStore();if(e==="")return new Promise((r,o)=>{let a=t.getAll();a.onerror=()=>o(a.error),a.onsuccess=()=>{let i=a.result,c=t.getAllKeys();c.onsuccess=()=>{let d=c.result.reduce((l,u,p)=>(u!=="root"&&(l[u]=i[p]),l),{});r(d)},c.onerror=()=>o(c.error)}});if(e instanceof T&&e.isUnparseable())return new Promise((r,o)=>{let a=t.get(e.valueOf());a.onerror=()=>o(a.error),a.onsuccess=()=>r(a.result)});let s=A(e);if(s.length>1){let r=s[0];return new Promise((o,a)=>{let i=t.get(r);i.onerror=()=>a(i.error),i.onsuccess=()=>{let c=i.result;if(!c){o(void 0);return}let d=C(c,s.slice(1).join("."));o(d)}})}return new Promise((r,o)=>{let a=t.get(s[0]);a.onerror=()=>o(a.error),a.onsuccess=()=>r(a.result)})}async doSet(e,t){if(e===""){let o=await this.getObjectStore("readwrite");return new Promise((a,i)=>{let c=o.transaction;c.oncomplete=()=>{a()},c.onerror=()=>{i(c.error)};let d=o.clear();d.onsuccess=()=>{let l=Object.entries(t);for(let[u,p]of l)o.put(p,u)},d.onerror=()=>{i(d.error)}})}let s=await this.getObjectStore("readwrite");if(e instanceof T&&e.isUnparseable()){await this.putValueInStore(s,e.valueOf(),t);return}let r=A(e);if(r.length>1){let o=r[0];return new Promise((a,i)=>{let c=s.get(o);c.onerror=()=>i(c.error),c.onsuccess=()=>{let d=c.result||{},l=O(d,r.slice(1).join("."),t),u=s.put(l,o);u.onerror=()=>i(u.error),u.onsuccess=()=>a()}})}await this.putValueInStore(s,r[0],t)}async putValueInStore(e,t,s){return new Promise((r,o)=>{let a=e.put(s,t.valueOf());a.onerror=()=>o(a.error),a.onsuccess=()=>r()})}async doUpdate(e){let t=new Map,s=[];for(let{key:r,value:o}of e){if(r instanceof T&&r.isUnparseable()){s.push({key:r.valueOf(),value:o});continue}let a=A(r),i=a[0],c=a.slice(1);t.has(i)||t.set(i,[]),t.get(i).push({path:c,value:o})}try{for(let{key:r,value:o}of s){let a=await this.getObjectStore("readwrite");await this.putValueInStore(a,r,o)}for(let[r,o]of t){let i={...await this.doGet(r)||{}};for(let{path:d,value:l}of o)d.length===0?i=l:i=O(i,d.join("."),l);let c=await this.getObjectStore("readwrite");await this.putValueInStore(c,r,i)}}catch(r){throw this.logger?.error("Error during update:",{error:r}),r}}async doDelete(e){let t=await this.getObjectStore("readwrite");if(e instanceof T&&e.isUnparseable())return new Promise((o,a)=>{let i=t.delete(e.valueOf());i.onerror=()=>a(i.error),i.onsuccess=()=>o(!0)});let s=A(e);if(s.length===1)return new Promise((o,a)=>{let i=t.delete(s[0]);i.onerror=()=>a(i.error),i.onsuccess=()=>o(!0)});let r=s[0];return new Promise((o,a)=>{let i=t.get(r);i.onerror=()=>a(i.error),i.onsuccess=()=>{let c=i.result;if(!c){o(!1);return}let d=C(c,s.slice(0,-1).join(".")),l=s[s.length-1];if(!d||!(l in d)){o(!1);return}if(Array.isArray(d)){let p=parseInt(l,10);isNaN(p)?delete d[l]:d.splice(p,1)}else delete d[l];let u=t.put(c,r);u.onerror=()=>a(u.error),u.onsuccess=()=>o(!0)}})}async doClear(){let e=await this.getObjectStore("readwrite");return new Promise((t,s)=>{let r=e.clear();r.onsuccess=()=>t(),r.onerror=()=>s(r.error)})}async doKeys(){let t=(await this.getObjectStore()).getAllKeys();return new Promise((s,r)=>{t.onsuccess=()=>{s(t.result)},t.onerror=()=>r(t.error)})}async doHas(e){return await this.doGet(e)!==void 0}async doDestroy(){try{await this.doClear()}catch(e){throw this.logger?.error(`Error destroying store "${this.STORE_NAME}"`,{error:e}),e}}};var oe=class extends M{constructor(e,t,s,r){super(e,t,s,r)}async doInitialize(){try{return this.logger?.debug(`Initializing LocalStorage "${this.name}"`),this.initializeMiddlewares(),await this.initializeWithMiddlewares(),this.logger?.debug(`LocalStorage "${this.name}" initialized successfully`),this}catch(e){throw this.logger?.error("Error initializing LocalStorage",{error:e}),e}}async doGet(e){let t=localStorage.getItem(this.name);if(!t)return;let s=JSON.parse(t);return e instanceof T&&e.isUnparseable()?s[e.valueOf()]:C(s,e)}async doSet(e,t){let s=localStorage.getItem(this.name),r=s?JSON.parse(s):{};if(e instanceof T&&e.isUnparseable()){r[e.valueOf()]=t,localStorage.setItem(this.name,JSON.stringify(r));return}let o=O({...r},e,t);localStorage.setItem(this.name,JSON.stringify(o))}async doDelete(e){let t=localStorage.getItem(this.name);if(!t)return!1;let s=JSON.parse(t);if(e instanceof T&&e.isUnparseable()){let c=e.valueOf();return c in s?(delete s[c],localStorage.setItem(this.name,JSON.stringify(s)),!0):!1}let r=A(e),o=r.slice(0,-1).join("."),a=r[r.length-1],i=o?C(s,o):s;return!i||!(a in i)?!1:(delete i[a],localStorage.setItem(this.name,JSON.stringify(s)),!0)}async doUpdate(e){let t=localStorage.getItem(this.name),s=t?JSON.parse(t):{};for(let{key:r,value:o}of e)r instanceof T&&r.isUnparseable()?s[r.valueOf()]=o:O(s,r,o);localStorage.setItem(this.name,JSON.stringify(s))}async doClear(){localStorage.removeItem(this.name)}async doKeys(){let e=localStorage.getItem(this.name);if(!e)return[];let t=JSON.parse(e);return this.getAllKeys(t)}async doHas(e){return await this.doGet(e)!==void 0}getAllKeys(e){return Object.keys(e)}async doDestroy(){await this.doClear()}};var B=class extends M{storage=new Map;constructor(e,t,s,r){super(e,t,s,r)}async doInitialize(){try{return this.logger?.debug(`Initializing MemoryStorage "${this.name}"`),this.initializeMiddlewares(),await this.initializeWithMiddlewares(),this.logger?.debug(`MemoryStorage "${this.name}" initialized successfully`),this}catch(e){throw this.logger?.error("Error initializing MemoryStorage",{error:e}),e}}async doGet(e){let t=this.storage.get(this.name);if(t)return e instanceof T&&e.isUnparseable()?t[e.valueOf()]:C(t,e)}async doSet(e,t){let s=this.storage.get(this.name)||{};if(e instanceof T&&e.isUnparseable()){s[e.valueOf()]=t,this.storage.set(this.name,s);return}let r=O({...s},e,t);this.storage.set(this.name,r)}async doDelete(e){let t=this.storage.get(this.name);if(!t)return!1;if(e instanceof T&&e.isUnparseable()){let i=e.valueOf();return i in t?(delete t[i],this.storage.set(this.name,t),!0):!1}let s=A(e),r=s.slice(0,-1).join("."),o=s[s.length-1],a=r?C(t,r):t;return!a||!(o in a)?!1:(delete a[o],this.storage.set(this.name,t),!0)}async doUpdate(e){let s={...this.storage.get(this.name)||{}};for(let{key:r,value:o}of e)r instanceof T&&r.isUnparseable()?s[r.valueOf()]=o:O(s,r,o);this.storage.set(this.name,s)}async doClear(){this.storage.delete(this.name)}async doKeys(){let e=this.storage.get(this.name);return e?this.getAllKeys(e):[]}async doHas(e){return await this.doGet(e)!==void 0}async doDestroy(){this.storage.delete(this.name)}getAllKeys(e){return Object.keys(e)}};import{useEffect as He,useRef as Ie,useState as De}from"react";var K=new Map;function cs(n,e){let[t,s]=De(e?.initialValue),[r,o]=De(!!e?.withLoading),a=Ie(e?.initialValue),i=Ie(e?.equals||((l,u)=>l===u)),c=n.getId(),d=l=>{(a.current===void 0||!i.current(l,a.current))&&(a.current=l,s(l))};return He(()=>{K.has(c)||K.set(c,{lastValue:void 0,listeners:new Set,unsubscribe:null});let l=K.get(c);return l.listeners.add(d),l.lastValue!==void 0?(d(l.lastValue),e?.withLoading&&o(!1)):(e?.withLoading&&o(!0),n.select().then(u=>{l.lastValue=u,l.listeners.forEach(p=>p(u)),e?.withLoading&&o(!1)}).catch(u=>{e?.withLoading&&o(!1)})),l.unsubscribe||(l.unsubscribe=n.subscribe({notify:u=>{l.lastValue=u,l.listeners.forEach(p=>{try{p(u)}catch{}})}})),()=>{let u=K.get(c);u&&(u.listeners.delete(d),u.listeners.size===0&&(u.unsubscribe&&u.unsubscribe(),K.delete(c)))}},[n,c]),e?.withLoading?{data:t,isLoading:r}:t}import{useEffect as Le,useState as ze}from"react";var us=(n,e)=>{let[t,s]=ze(void 0);return Le(()=>{let r=!0;(async()=>{try{let i=await n.getState(),c=e(i);r&&s(c)}catch{}})();let a;try{a=n.subscribe(e,i=>{r&&s(i)})}catch{a=()=>{}}return()=>{r=!1,a()}},[n,e]),t};import{useEffect as ht,useState as de}from"react";import{Observable as _e,Subject as Oe}from"rxjs";var ie=class{constructor(e){this.options=e;this.storage=e.storage,this.middlewareAPI={getState:()=>this.storage.getState(),dispatch:async t=>(this.actions$.next(t),t.payload),storage:this.storage,actions$:this.actions,actions:this.dispatch,watchers:this.watchers,findActionByType:t=>this.findActionByType(t),findWatcherByType:t=>this.findWatcherByType(t)},e.middlewares&&e.middlewares.length>0&&this.use(...e.middlewares)}actions$=new Oe;actions=this.actions$.asObservable();dispatch={};watchers={};storage;middlewareFunctions=[];middlewareAPI;use(...e){for(let t=0;t<e.length;t++)try{let s=e[t](this.middlewareAPI);this.middlewareFunctions.push(s)}catch{}return this}getActions(){return this.dispatch}getTypedDispatch(){return this.dispatch}getTypedWatchers(){return this.watchers}findActionByType(e){return Object.values(this.dispatch).find(t=>t.actionType.split(`[${this.storage.name}]`)[1]===e)}findWatcherByType(e){return Object.values(this.watchers).find(t=>t.actionType===e)}createAction(e,t){let s=`[${this.storage.name}]${e.type}`,r=null,o=null,a=async i=>{let c=[i];if(t?.memoize&&r&&o&&t.memoize(c,r,o))return o;let d={type:s,meta:e.meta},l;if(this.middlewareFunctions.length>0){let u=async p=>t?.worker?this.executeInWorker(t.worker,s,c,e.action):Promise.resolve(e.action(i));for(let p=this.middlewareFunctions.length-1;p>=0;p--){let g=this.middlewareFunctions[p],h=u;u=async y=>g(async S=>h(S))(y)}l=await u(d)}else t?.worker?l=await this.executeInWorker(t.worker,s,c,e.action):l=await e.action(i);return d.payload=l,r=[...c],o=l,this.actions$.next(d),l};return a.r="dispatch",Object.defineProperty(a,"actionType",{value:s,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(a,"meta",{value:e.meta,writable:!1,enumerable:!0}),a}createWatcher(e){let t=`[${this.storage.name}]${e.type}`,s=new Oe,r,o=async()=>{let c=await this.storage.getState();return e.selector(c)},a=this.storage.subscribe(e.selector,c=>{if(!e.shouldTrigger||e.shouldTrigger(r,c)){let d={type:t,payload:c,meta:e.meta};this.actions$.next(d),s.next(d),r=c}}),i=()=>{let c=s.asObservable();return e.notifyAfterSubscribe?new _e(d=>{let l=!1;o().then(p=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,p)){let g={type:t,payload:p,meta:{...e.meta,isInitial:!0}};d.next(g),r=p,l=!0}}).catch(p=>{d.error(p)});let u=c.subscribe({next:p=>{l&&p.payload===r||d.next(p)},error:p=>d.error(p),complete:()=>d.complete()});return()=>{u.unsubscribe()}}):c};return i.r="watchers",Object.defineProperty(i,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(i,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(i,"unsubscribe",{value:a,writable:!1,enumerable:!0}),i}async executeInWorker(e,t,s,r){return new Promise((o,a)=>{let i=`${t}_${Date.now()}_${Math.random()}`,c=d=>{d.data.requestId===i&&(e.removeEventListener("message",c),d.data.error?a(new Error(d.data.error)):o(d.data.result))};e.addEventListener("message",c),e.postMessage({type:t,args:s,requestId:i}),setTimeout(()=>{e.removeEventListener("message",c),a(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function Me(n,e){let t=new ie(n),s=e(n.storage,{createAction:(r,o)=>t.createAction(r,o),createWatcher:r=>t.createWatcher(r)});for(let[r,o]of Object.entries(s))if(typeof o=="function"){let a=o.r;t[a][r]=o}return t}function G(n,e=1){if(e<=0)throw new Error("Size must be greater than 0");if(!n||!n.length)return[];let t=[],s=n.length,r=0;for(;r<s;)t.push(n.slice(r,r+e)),r+=e;return t}var F=globalThis.console,P={log:(...n)=>F.log(...n),warn:(...n)=>F.warn(...n),error:(...n)=>F.error(...n),group:(...n)=>F.group(...n),groupEnd:()=>F.groupEnd(),groupCollapsed:(...n)=>F.groupCollapsed(...n)};function Fe(n,e){let t={};return[...new Set([...Object.keys(n),...Object.keys(e)])].forEach(r=>{if(r in n&&r in e)if(typeof n[r]=="object"&&n[r]!==null&&typeof e[r]=="object"&&e[r]!==null&&!Array.isArray(n[r])&&!Array.isArray(e[r])){let o=Fe(n[r],e[r]);Object.keys(o).length>0&&(t[r]=o)}else JSON.stringify(n[r])!==JSON.stringify(e[r])&&(t[r]={PREV:n[r],NEXT:e[r]});else r in n?t[r]={PREV:n[r],NEXT:void 0}:t[r]={PREV:void 0,NEXT:e[r]}}),t}var Cs=(n={})=>{let e={action:"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435",prevState:"\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",nextState:"\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",duration:"\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C",error:"\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438",diff:"\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F",changesCount:"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439",showFullState:"\u041F\u043E\u043B\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435"},t={collapsed:!1,duration:!0,diff:!1,showFullState:!0,translations:e,colors:{title:"#3498db",prevState:"#9E9E9E",fullState:"#008a15",action:"#03A9F4",nextState:"#4CAF50",error:"#F20404",diff:"#9C27B0"}},s={...t,...n,translations:{...e,...n.translations||{}},colors:{...t.colors,...n.colors||{}}},{collapsed:r,duration:o,colors:a,translations:i}=s;return c=>d=>async l=>{let u=Date.now(),p=await c.getState();try{let g=await d(l),h=await c.getState(),E=Date.now()-u,S=`${l.type}`;if((r?P.groupCollapsed:P.group)(`%c ${S}`,`color: ${a.title}; font-weight: bold`),P.log(`%c ${i.action}:`,`color: ${a.action}; font-weight: bold`,l),s.diff){let R=Fe(p,h),w=Object.keys(R).length;P.log(`%c ${i.diff} (${i.changesCount}: ${w}):`,`color: ${a.diff}; font-weight: bold`,R)}return s.showFullState&&(P.groupCollapsed(`%c ${i.showFullState}`,`color: ${a.fullState}; font-weight: bold`),P.log(`%c ${i.prevState}:`,`color: ${a.prevState}; font-weight: bold`,p),P.log(`%c ${i.nextState}:`,`color: ${a.nextState}; font-weight: bold`,h),P.groupEnd()),o&&P.log(`%c ${i.duration}: %c ${E}ms`,"font-weight: bold","color: #4CAF50"),P.groupEnd(),g}catch(g){throw P.error(`%c ${i.error}:`,`color: ${a.error}; font-weight: bold`,l.type,g),g}}};import{combineLatest as et,merge as tt,Observable as rt,of as q,pipe as st,Subject as nt}from"rxjs";import{catchError as at,filter as N,map as Q,share as ot,switchMap as it,take as ct}from"rxjs/operators";import{of as $e}from"rxjs";import{concatAll as We,delay as Ge,mergeMap as Qe,toArray as Je}from"rxjs/operators";var Be=(n,e,t,s=0)=>{let r=G(e,t).map(o=>$e(o).pipe(Ge(s),Qe(n)));return $e(...r).pipe(We(),Je())};import{forkJoin as Ye,timer as Xe}from"rxjs";import{mergeMap as Ze}from"rxjs/operators";var Ke=(n,e,t,s=0)=>Ye(G(e,t).map((r,o)=>Xe(o*s).pipe(Ze(()=>n(r)))));function en(n){let{actionType:e}=n;return e?t=>t.pipe(N(s=>s!==void 0&&s.type===e)):N(()=>!1)}function tn(n){let e=n.map(t=>t.actionType).filter(Boolean);return e.length===0?N(()=>!1):t=>t.pipe(N(s=>s!==void 0&&e.includes(s.type)))}function rn(n){return e=>{let t=n.map(r=>r.actionType).filter(Boolean);if(t.length===0)return q([]);let s=t.map((r,o)=>e.pipe(N(a=>a.type===r),ct(1),Q(a=>({index:o,action:a}))));return et(s).pipe(Q(r=>(r.sort((o,a)=>o.index-a.index),r.map(o=>o.action))))}}function sn(n,...e){return n.pipe(Q(t=>e.map(s=>s(t))))}function nn(n,e){return n.pipe(Q(t=>{let s={};for(let[r,o]of Object.entries(e))s[r]=o(t);return s}))}function an({validator:n,apiCall:e}){return st(it(t=>{let s=()=>e(t,{chunkRequest:Ke,chunkRequestConsistent:Be});if(!n)return s();let r=n(t),{conditions:o,skipAction:a}=r;return o.every(Boolean)?s():Array.isArray(a)?q(...a?.filter(Boolean).map(c=>typeof c=="function"?c():c)):q(typeof a=="function"?a():a)}))}var J=class{constructor(e,t={},s,r={},o={}){this.storage=e;this.externalStates=t;this.dispatchers=s;this.services=r;this.config=o;this.subscribeToDispatchers(),this.state$=new rt(a=>{this.storage.getState().then(c=>a.next(c));let i=this.storage.subscribeToAll(()=>{this.storage.getState().then(c=>a.next(c))});return()=>i()}).pipe(ot())}effects=[];subscriptions=[];running=!1;action$=new nt;state$;subscribeToDispatchers(){for(let[e,t]of Object.entries(this.dispatchers)){let s=t.actions.subscribe(r=>{this.action$.next(r)});this.subscriptions.push(s)}}add(e){return this.effects.push(e),this.running&&this.subscribeToEffect(e),this}addEffects(e){return e.forEach(t=>this.add(t)),this}async start(){return this.running?this:(await this.storage.waitForReady(),this.effects.forEach(e=>this.subscribeToEffect(e)),this.running=!0,this)}stop(){return this.subscriptions.forEach(e=>e.unsubscribe()),this.subscriptions=[],this.running=!1,this}subscribeToEffect(e){try{let s=e(this.action$.asObservable(),this.state$,this.externalStates,this.dispatchers,this.services,this.config).pipe(at(r=>q(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function on(n){return n}function cn(n){return n}function ln(...n){return(e,t,s,r,o,a)=>{let i=n.map(c=>{try{return c(e,t,s,r,o,a)}catch{return q(null)}});return tt(...i)}}function lt(n){if(!n.storage&&!n.createStorageFn)throw new Error('Synapse config must have either "storage" or "createStorageFn"');if(n.storage&&n.createStorageFn)throw new Error('Synapse config cannot have both "storage" and "createStorageFn". Choose one.');if(n.effects&&!n.createDispatcherFn)throw new Error('Effects require dispatcher. Add "createDispatcherFn" to config.');if(n.createEffectConfig&&!n.createDispatcherFn)throw new Error('Effect config requires dispatcher. Add "createDispatcherFn" to config.');if(n.dependencies){if(!Array.isArray(n.dependencies))throw new Error("Dependencies must be an array");n.dependencies.forEach((e,t)=>{if(!e||typeof e!="object")throw new Error(`Dependency at index ${t} must be an object`);if(!e.storage||typeof e.storage.waitForReady!="function")throw new Error(`Dependency at index ${t} must have a storage with waitForReady method`)})}if(n.createStorageFn&&typeof n.createStorageFn!="function")throw new Error('"createStorageFn" must be a function');if(n.createDispatcherFn&&typeof n.createDispatcherFn!="function")throw new Error('"createDispatcherFn" must be a function');if(n.createSelectorsFn&&typeof n.createSelectorsFn!="function")throw new Error('"createSelectorsFn" must be a function');if(n.createEffectConfig&&typeof n.createEffectConfig!="function")throw new Error('"createEffectConfig" must be a function');if(n.effects){if(!Array.isArray(n.effects))throw new Error("Effects must be an array");n.effects.forEach((e,t)=>{if(typeof e!="function")throw new Error(`Effect at index ${t} must be a function`)})}if(n.externalSelectors&&typeof n.externalSelectors!="object")throw new Error("External selectors must be an object")}async function dt(n=[]){n.length!==0&&await Promise.all(n.map(async(e,t)=>{try{await e.storage.waitForReady()}catch(s){throw new Error(`Dependency ${t} initialization failed: ${s}`)}}))}async function ce(n){try{lt(n)}catch(i){throw i}await dt(n.dependencies);let e=n.createStorageFn?await n.createStorageFn():n.storage;await e.waitForReady();let t=[],s={storage:e,selectors:{},destroy:async()=>{for(let i of t)await i()}};t.push(()=>e.destroy());let r,o,a;if(n.createSelectorsFn)try{o=new z(e);let i=n.externalSelectors||{};s.selectors=n.createSelectorsFn(o,i),typeof o.destroy=="function"&&t.push(()=>o.destroy())}catch{}if(n.createDispatcherFn&&(r=n.createDispatcherFn(e),s.dispatcher=r,r&&"dispatch"in r&&(s.actions=r.dispatch,typeof r.destroy=="function"&&t.push(()=>r.destroy()))),n.createEffectConfig&&r)try{let{dispatchers:i,api:c,config:d,externalStates:l}=n.createEffectConfig(r),u=l||{};a=new J(e,u,i,c,d),Array.isArray(n.effects)&&n.effects.forEach(p=>{a&&a.add(p)}),await a.start(),s.state$=a.state$,t.push(()=>{a&&a.stop()})}catch{}return s}function ut(n,e){return e==="*"?!0:e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(n):n===e}async function pt(n,e){let t=await n.getState(),s=Object.entries(t.events||{});if(s.length>e){let o=s.sort((a,i)=>i[1].timestamp-a[1].timestamp).slice(0,e);await n.set("events",Object.fromEntries(o))}}var gt=(n={})=>ce({createStorageFn:async()=>new B({name:n.name||"eventBus",initialState:{events:{},subscriptions:{}}}).initialize(),createDispatcherFn:e=>Me({storage:e},(t,{createAction:s})=>({publish:s({type:"PUBLISH_EVENT",meta:{description:"\u041F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u044F \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0432 EventBus"},action:async({event:r,data:o,metadata:a={}})=>{let i=`${r}_${Date.now()}_${Math.random()}`;return await t.set(`events.${i}`,{id:i,event:r,data:o,metadata:{ttl:a.ttl||null,priority:a.priority||"normal",...a},timestamp:Date.now()}),n.autoCleanup&&await pt(t,n.maxEvents||1e3),{eventId:i,event:r,data:o}}}),subscribe:s({type:"SUBSCRIBE_TO_EVENT",meta:{description:"\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u043D\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0432 EventBus"},action:async({eventPattern:r,handler:o,options:a={}})=>{let i=`sub_${Date.now()}_${Math.random()}`,c=t.subscribe(d=>d.events,d=>{Object.values(d||{}).forEach(l=>{if(ut(l.event,r)){if(a.priority&&l.metadata.priority!==a.priority)return;try{o(l.data,l)}catch{}}})});return await t.set(`subscriptions.${i}`,{id:i,pattern:r,options:a,createdAt:Date.now()}),{subscriptionId:i,unsubscribe:c}}}),getEventHistory:s({type:"GET_EVENT_HISTORY",meta:{description:"\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u0441\u043E\u0431\u044B\u0442\u0438\u0439"},action:async({eventType:r,limit:o=100})=>{let a=await t.getState();return Object.values(a.events||{}).filter(i=>i.event===r).sort((i,c)=>c.timestamp-i.timestamp).slice(0,o)}}),clearEvents:s({type:"CLEAR_EVENTS",meta:{description:"\u041E\u0447\u0438\u0441\u0442\u043A\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u0439"},action:async({olderThan:r}={})=>{if(r){let o=Date.now()-r;await t.update(a=>{Object.keys(a.events||{}).forEach(i=>{a.events[i].timestamp<o&&delete a.events[i]})})}else await t.set("events",{})}}),getActiveSubscriptions:s({type:"GET_SUBSCRIPTIONS",meta:{description:"\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A"},action:async()=>{let r=await t.getState();return Object.values(r.subscriptions||{})}})}))});function le(n){let e="pending",t,s=null,r=new Set,o=new Set,a=(async()=>{try{let i=await(n instanceof Promise?n:Promise.resolve(n));return await i.storage.waitForReady(),t=i,e="ready",r.forEach(c=>{try{c(t)}catch{}}),i}catch(i){let c=i instanceof Error?i:new Error(String(i));throw s=c,e="error",o.forEach(d=>{try{d(c)}catch{}}),c}})();return{waitForReady:()=>a,isReady:()=>e==="ready",getStoreIfReady:()=>t,onReady:i=>{if(e==="ready"&&t)try{i(t)}catch{}else r.add(i);return()=>{r.delete(i)}},onError:i=>{if(e==="error"&&s)try{i(s)}catch{}else o.add(i);return()=>{o.delete(i)}},getStatus:()=>e,getError:()=>s,destroy:()=>{r.clear(),o.clear(),t=void 0,s=null,e="pending"}}}import{Fragment as qe,jsx as Y,jsxs as ft}from"react/jsx-runtime";function yt(n,e){let{loadingComponent:t=Y("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F..."}),errorComponent:s=i=>ft("div",{children:["\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438: ",i.message]})}=e||{},r=le(n);function o(){let[i,c]=de(()=>r.getStatus()),[d,l]=de(()=>r.getStoreIfReady()),[u,p]=de(()=>r.getError());return ht(()=>{let g=r.getStatus(),h=r.getStoreIfReady(),y=r.getError();c(g),l(h),p(y);let E=r.onReady(f=>{c("ready"),l(f),p(null)}),S=r.onError(f=>{c("error"),l(void 0),p(f)});return()=>{E(),S()}},[]),{isReady:i==="ready",isError:i==="error",isPending:i==="pending",store:d,error:u}}function a(i){function c(l){let{isReady:u,isError:p,error:g}=o();return p&&g?Y(qe,{children:s(g)}):u?Y(i,{...l}):Y(qe,{children:t})}let d=i.displayName||i.name||"Component";return c.displayName=`AwaitSynapse(${d})`,c}return{withSynapseReady:a,useSynapseReady:o,waitForReady:r.waitForReady,isReady:r.isReady,getStoreIfReady:r.getStoreIfReady,onReady:r.onReady,onError:r.onError,getStatus:r.getStatus,getError:r.getError,destroy:r.destroy}}import{createContext as St,useContext as X,useEffect as mt,useState as ue}from"react";import{Fragment as wt,jsx as k}from"react/jsx-runtime";var Z="\u0425\u0443\u043A \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 contextSynapse",Tt="\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430:";function bt(n,e){let{loadingComponent:t=k("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430..."})}=e||{},s=(async()=>{try{let u=await(n instanceof Promise?n:Promise.resolve(n));return await u.storage.waitForReady(),u}catch(u){throw u}})(),r=St(null),o=()=>{let u=X(r);if(!u)throw new Error(`useSynapseStorage: ${Z}`);return u.storage},a=()=>{let u=X(r);if(!u)throw new Error(`useSynapseSelectors: ${Z}`);return u.selectors},i=()=>{let u=X(r);if(!u)throw new Error(`useSynapseActions: ${Z}`);if("actions"in u)return u.actions;throw new Error("useSynapseActions: actions \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u044F createDispatcherFn \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")},c=()=>{let u=X(r);if(!u)throw new Error(`useSynapseState$: ${Z}`);if("state$"in u)return u.state$;throw new Error("useSynapseState$: state$ \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u044B \u0444\u0443\u043D\u043A\u0446\u0438\u0438 createDispatcherFn \u0438 createEffectConfig \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")};function d(u){function p(h){let[y,E]=ue(null),[S,f]=ue(!1),[R,w]=ue(null);return mt(()=>{let m=!0;return(async()=>{try{let x=await s;m&&(E(x),f(!0))}catch(x){m&&w(x instanceof Error?x:new Error(String(x)))}})(),()=>{m=!1}},[]),R?k("div",{children:`${Tt}: ${R.message}`}):!S||!y?k(wt,{children:t}):k(r.Provider,{value:y,children:k(u,{...h})})}let g=u.displayName||u.name||"Component";return p.displayName=`SynapseContext(${g})`,p}return{contextSynapse:d,useSynapseStorage:o,useSynapseSelectors:a,useSynapseActions:i,useSynapseState$:c,cleanupSynapse:async()=>{try{return(await s)?.destroy()||Promise.resolve()}catch{}}}}export{we as ApiClient,ie as Dispatcher,J as EffectsModule,ae as IndexedDBStorage,oe as LocalStorage,B as MemoryStorage,V as ResponseFormat,z as SelectorModule,re as StorageEvents,Re as StoragePluginModule,xe as StorageStatus,pe as apiLogger,yt as awaitSynapse,Pe as broadcastMiddleware,ln as combineEffects,Me as createDispatcher,cn as createEffect,on as createEffectBase,gt as createEventBus,ce as createSynapse,le as createSynapseAwaiter,bt as createSynapseCtx,ge as createUniqueId,he as headersToObject,Cs as loggerDispatcherMiddleware,en as ofType,tn as ofTypes,rn as ofTypesWaitAll,sn as selectorMap,nn as selectorObject,cs as useSelector,us as useStorageSubscribe,an as validateMap};
|
|
1
|
+
export * from "./api/index.js";
|
|
2
|
+
export * from "./core/index.js";
|
|
3
|
+
export * from "./react/index.js";
|
|
4
|
+
export * from "./reactive/index.js";
|
|
5
|
+
export * from "./utils/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* Synapse - Библиотека управления состоянием и API-клиент
|
|
8
|
+
* @author Vlad Firsov
|
|
9
|
+
*/ // Основные модули
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * Synapse - Библиотека управления состоянием и API-клиент\n * @author Vlad Firsov\n */\n\n// Основные модули\nexport * from './api'\nexport * from './core'\nexport * from './react'\nexport * from './reactive'\nexport * from './utils'\n"],"names":[],"mappings":";;;;;AAAA;;;CAGC,GAED,kBAAkB;AACG;AACC;AACC;AACG;AACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react/hooks/index.js","sources":["../../../src/react/hooks/index.ts"],"sourcesContent":["export * from './useCreateStorage'\nexport * from './useSelector'\nexport * from './useStorage'\nexport * from './useStorageSubscribe'\n"],"names":[],"mappings":";;;;AAAkC;AACL;AACD;AACS"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { IAsyncPluginExecutor, IAsyncStorage, IEventEmitter, ILogger, IStorage, ISyncPluginExecutor, ISyncStorage, StorageInitStatus, UniversalStorageConfig } from '../../core';
|
|
2
|
+
export interface UseSynapseStorageOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Автоматически инициализировать при монтировании
|
|
5
|
+
*/
|
|
6
|
+
autoInitialize?: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Уничтожать storage при размонтировании
|
|
9
|
+
*/
|
|
10
|
+
destroyOnUnmount?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export type UseSynapseStorageReturn<S> = {
|
|
13
|
+
storage: S;
|
|
14
|
+
status: StorageInitStatus;
|
|
15
|
+
initialize: () => Promise<void>;
|
|
16
|
+
destroy: () => Promise<void>;
|
|
17
|
+
isReady: true;
|
|
18
|
+
isLoading: false;
|
|
19
|
+
hasError: false;
|
|
20
|
+
} | {
|
|
21
|
+
storage: null;
|
|
22
|
+
status: StorageInitStatus;
|
|
23
|
+
initialize: () => Promise<void>;
|
|
24
|
+
destroy: () => Promise<void>;
|
|
25
|
+
isReady: false;
|
|
26
|
+
isLoading: boolean;
|
|
27
|
+
hasError: boolean;
|
|
28
|
+
};
|
|
29
|
+
export declare function useCreateStorage<T extends Record<string, any>>(config: UniversalStorageConfig<T> & {
|
|
30
|
+
type: 'memory';
|
|
31
|
+
}, options?: UseSynapseStorageOptions, pluginExecutor?: ISyncPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger): UseSynapseStorageReturn<ISyncStorage<T>>;
|
|
32
|
+
export declare function useCreateStorage<T extends Record<string, any>>(config: UniversalStorageConfig<T> & {
|
|
33
|
+
type: 'localStorage';
|
|
34
|
+
}, options?: UseSynapseStorageOptions, pluginExecutor?: ISyncPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger): UseSynapseStorageReturn<ISyncStorage<T>>;
|
|
35
|
+
export declare function useCreateStorage<T extends Record<string, any>>(config: UniversalStorageConfig<T> & {
|
|
36
|
+
type: 'indexedDB';
|
|
37
|
+
}, options?: UseSynapseStorageOptions, pluginExecutor?: IAsyncPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger): UseSynapseStorageReturn<IAsyncStorage<T>>;
|
|
38
|
+
export declare function useCreateStorage<T extends Record<string, any>>(config: UniversalStorageConfig<T>, options?: UseSynapseStorageOptions, pluginExecutor?: ISyncPluginExecutor | IAsyncPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger): UseSynapseStorageReturn<IStorage<T>>;
|
|
39
|
+
//# sourceMappingURL=useCreateStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCreateStorage.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useCreateStorage.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,YAAY,EAEZ,iBAAiB,EAEjB,sBAAsB,EACvB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,MAAM,MAAM,uBAAuB,CAAC,CAAC,IACjC;IACE,OAAO,EAAE,CAAC,CAAA;IACV,MAAM,EAAE,iBAAiB,CAAA;IACzB,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,OAAO,EAAE,IAAI,CAAA;IACb,SAAS,EAAE,KAAK,CAAA;IAChB,QAAQ,EAAE,KAAK,CAAA;CAChB,GACD;IACE,OAAO,EAAE,IAAI,CAAA;IACb,MAAM,EAAE,iBAAiB,CAAA;IACzB,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,OAAO,EAAE,KAAK,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAIL,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,EACtD,OAAO,CAAC,EAAE,wBAAwB,EAClC,cAAc,CAAC,EAAE,mBAAmB,EACpC,YAAY,CAAC,EAAE,aAAa,EAC5B,MAAM,CAAC,EAAE,OAAO,GACf,uBAAuB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;AAE3C,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,EAC5D,OAAO,CAAC,EAAE,wBAAwB,EAClC,cAAc,CAAC,EAAE,mBAAmB,EACpC,YAAY,CAAC,EAAE,aAAa,EAC5B,MAAM,CAAC,EAAE,OAAO,GACf,uBAAuB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;AAE3C,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,EACzD,OAAO,CAAC,EAAE,wBAAwB,EAClC,cAAc,CAAC,EAAE,oBAAoB,EACrC,YAAY,CAAC,EAAE,aAAa,EAC5B,MAAM,CAAC,EAAE,OAAO,GACf,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;AAE5C,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,EACjC,OAAO,CAAC,EAAE,wBAAwB,EAClC,cAAc,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,EAC3D,YAAY,CAAC,EAAE,aAAa,EAC5B,MAAM,CAAC,EAAE,OAAO,GACf,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
+
import { handleCleanupError } from "../../_utils/error-handling.util.js";
|
|
3
|
+
import { StorageFactory, StorageStatus } from "../../core/index.js";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
// ─── Реализация ─────────────────────────────────────────────────────────────
|
|
12
|
+
function useCreateStorage(config, options = {}, pluginExecutor, eventEmitter, logger) {
|
|
13
|
+
const destroyDefault = config.type === 'indexedDB' ? false : true;
|
|
14
|
+
const { autoInitialize = true, destroyOnUnmount = destroyDefault } = options;
|
|
15
|
+
const [status, setStatus] = useState({
|
|
16
|
+
status: StorageStatus.IDLE
|
|
17
|
+
});
|
|
18
|
+
const [storage] = useState(()=>{
|
|
19
|
+
try {
|
|
20
|
+
return StorageFactory.create(config, pluginExecutor, eventEmitter, logger);
|
|
21
|
+
} catch (error) {
|
|
22
|
+
setStatus({
|
|
23
|
+
status: StorageStatus.ERROR,
|
|
24
|
+
error: error
|
|
25
|
+
});
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
const destroyOnUnmountRef = useRef(destroyOnUnmount);
|
|
30
|
+
destroyOnUnmountRef.current = destroyOnUnmount;
|
|
31
|
+
const initialize = useCallback(async ()=>{
|
|
32
|
+
if (!storage) return;
|
|
33
|
+
try {
|
|
34
|
+
setStatus({
|
|
35
|
+
status: StorageStatus.LOADING
|
|
36
|
+
});
|
|
37
|
+
await storage.initialize();
|
|
38
|
+
setStatus({
|
|
39
|
+
status: StorageStatus.READY
|
|
40
|
+
});
|
|
41
|
+
} catch (error) {
|
|
42
|
+
setStatus({
|
|
43
|
+
status: StorageStatus.ERROR,
|
|
44
|
+
error: error
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}, [
|
|
48
|
+
storage
|
|
49
|
+
]);
|
|
50
|
+
const destroy = useCallback(async ()=>{
|
|
51
|
+
if (!storage) return;
|
|
52
|
+
try {
|
|
53
|
+
await storage.destroy();
|
|
54
|
+
setStatus({
|
|
55
|
+
status: StorageStatus.IDLE
|
|
56
|
+
});
|
|
57
|
+
} catch (error) {
|
|
58
|
+
setStatus({
|
|
59
|
+
status: StorageStatus.ERROR,
|
|
60
|
+
error: error
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}, [
|
|
64
|
+
storage
|
|
65
|
+
]);
|
|
66
|
+
useEffect(()=>{
|
|
67
|
+
if (!storage) return;
|
|
68
|
+
const unsubscribe = storage.onStatusChange((newStatus)=>{
|
|
69
|
+
setStatus(newStatus);
|
|
70
|
+
});
|
|
71
|
+
return unsubscribe;
|
|
72
|
+
}, [
|
|
73
|
+
storage
|
|
74
|
+
]);
|
|
75
|
+
// Автоматическая инициализация
|
|
76
|
+
useEffect(()=>{
|
|
77
|
+
let cancelled = false;
|
|
78
|
+
if (autoInitialize && storage && status.status === StorageStatus.IDLE) {
|
|
79
|
+
setStatus({
|
|
80
|
+
status: StorageStatus.LOADING
|
|
81
|
+
});
|
|
82
|
+
storage.initialize().then(()=>{
|
|
83
|
+
if (!cancelled) setStatus({
|
|
84
|
+
status: StorageStatus.READY
|
|
85
|
+
});
|
|
86
|
+
}).catch((error)=>{
|
|
87
|
+
if (!cancelled) setStatus({
|
|
88
|
+
status: StorageStatus.ERROR,
|
|
89
|
+
error: error
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return ()=>{
|
|
94
|
+
cancelled = true;
|
|
95
|
+
};
|
|
96
|
+
}, [
|
|
97
|
+
autoInitialize,
|
|
98
|
+
storage,
|
|
99
|
+
status.status
|
|
100
|
+
]);
|
|
101
|
+
useEffect(()=>{
|
|
102
|
+
return ()=>{
|
|
103
|
+
if (destroyOnUnmountRef.current && storage) {
|
|
104
|
+
storage.destroy().catch((err)=>handleCleanupError('useCreateStorage: error during unmount destroy', err));
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}, [
|
|
108
|
+
storage
|
|
109
|
+
]);
|
|
110
|
+
const isReady = status.status === StorageStatus.READY;
|
|
111
|
+
const isLoading = status.status === StorageStatus.LOADING;
|
|
112
|
+
const hasError = status.status === StorageStatus.ERROR;
|
|
113
|
+
if (isReady && storage) {
|
|
114
|
+
return {
|
|
115
|
+
storage,
|
|
116
|
+
status,
|
|
117
|
+
initialize,
|
|
118
|
+
destroy,
|
|
119
|
+
isReady: true,
|
|
120
|
+
isLoading: false,
|
|
121
|
+
hasError: false
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
storage: null,
|
|
126
|
+
status,
|
|
127
|
+
initialize,
|
|
128
|
+
destroy,
|
|
129
|
+
isReady: false,
|
|
130
|
+
isLoading,
|
|
131
|
+
hasError
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export { useCreateStorage };
|
|
136
|
+
|
|
137
|
+
//# sourceMappingURL=useCreateStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react/hooks/useCreateStorage.js","sources":["../../../src/react/hooks/useCreateStorage.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { handleCleanupError } from '../../_utils/error-handling.util'\nimport {\n IAsyncPluginExecutor,\n IAsyncStorage,\n IEventEmitter,\n ILogger,\n IStorage,\n ISyncPluginExecutor,\n ISyncStorage,\n StorageFactory,\n StorageInitStatus,\n StorageStatus,\n UniversalStorageConfig,\n} from '../../core'\n\nexport interface UseSynapseStorageOptions {\n /**\n * Автоматически инициализировать при монтировании\n */\n autoInitialize?: boolean\n /**\n * Уничтожать storage при размонтировании\n */\n destroyOnUnmount?: boolean\n}\n\nexport type UseSynapseStorageReturn<S> =\n | {\n storage: S\n status: StorageInitStatus\n initialize: () => Promise<void>\n destroy: () => Promise<void>\n isReady: true\n isLoading: false\n hasError: false\n }\n | {\n storage: null\n status: StorageInitStatus\n initialize: () => Promise<void>\n destroy: () => Promise<void>\n isReady: false\n isLoading: boolean\n hasError: boolean\n }\n\n// ─── Перегрузки ─────────────────────────────────────────────────────────────\n\nexport function useCreateStorage<T extends Record<string, any>>(\n config: UniversalStorageConfig<T> & { type: 'memory' },\n options?: UseSynapseStorageOptions,\n pluginExecutor?: ISyncPluginExecutor,\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n): UseSynapseStorageReturn<ISyncStorage<T>>\n\nexport function useCreateStorage<T extends Record<string, any>>(\n config: UniversalStorageConfig<T> & { type: 'localStorage' },\n options?: UseSynapseStorageOptions,\n pluginExecutor?: ISyncPluginExecutor,\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n): UseSynapseStorageReturn<ISyncStorage<T>>\n\nexport function useCreateStorage<T extends Record<string, any>>(\n config: UniversalStorageConfig<T> & { type: 'indexedDB' },\n options?: UseSynapseStorageOptions,\n pluginExecutor?: IAsyncPluginExecutor,\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n): UseSynapseStorageReturn<IAsyncStorage<T>>\n\nexport function useCreateStorage<T extends Record<string, any>>(\n config: UniversalStorageConfig<T>,\n options?: UseSynapseStorageOptions,\n pluginExecutor?: ISyncPluginExecutor | IAsyncPluginExecutor,\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n): UseSynapseStorageReturn<IStorage<T>>\n\n// ─── Реализация ─────────────────────────────────────────────────────────────\n\nexport function useCreateStorage<T extends Record<string, any>>(\n config: UniversalStorageConfig<T>,\n options: UseSynapseStorageOptions = {},\n pluginExecutor?: ISyncPluginExecutor | IAsyncPluginExecutor,\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n): UseSynapseStorageReturn<IStorage<T>> {\n const destroyDefault = config.type === 'indexedDB' ? false : true\n const { autoInitialize = true, destroyOnUnmount = destroyDefault } = options\n\n const [status, setStatus] = useState<StorageInitStatus>({\n status: StorageStatus.IDLE,\n })\n\n const [storage] = useState<IStorage<T> | null>(() => {\n try {\n return StorageFactory.create<T>(config, pluginExecutor, eventEmitter, logger)\n } catch (error) {\n setStatus({\n status: StorageStatus.ERROR,\n error: error as Error,\n })\n return null\n }\n })\n\n const destroyOnUnmountRef = useRef(destroyOnUnmount)\n destroyOnUnmountRef.current = destroyOnUnmount\n\n const initialize = useCallback(async () => {\n if (!storage) return\n\n try {\n setStatus({ status: StorageStatus.LOADING })\n await storage.initialize()\n setStatus({ status: StorageStatus.READY })\n } catch (error) {\n setStatus({\n status: StorageStatus.ERROR,\n error: error as Error,\n })\n }\n }, [storage])\n\n const destroy = useCallback(async () => {\n if (!storage) return\n\n try {\n await storage.destroy()\n setStatus({ status: StorageStatus.IDLE })\n } catch (error) {\n setStatus({\n status: StorageStatus.ERROR,\n error: error as Error,\n })\n }\n }, [storage])\n\n useEffect(() => {\n if (!storage) return\n\n const unsubscribe = storage.onStatusChange((newStatus) => {\n setStatus(newStatus)\n })\n\n return unsubscribe\n }, [storage])\n\n // Автоматическая инициализация\n useEffect(() => {\n let cancelled = false\n\n if (autoInitialize && storage && status.status === StorageStatus.IDLE) {\n setStatus({ status: StorageStatus.LOADING })\n storage\n .initialize()\n .then(() => {\n if (!cancelled) setStatus({ status: StorageStatus.READY })\n })\n .catch((error) => {\n if (!cancelled) setStatus({ status: StorageStatus.ERROR, error: error as Error })\n })\n }\n\n return () => {\n cancelled = true\n }\n }, [autoInitialize, storage, status.status])\n\n useEffect(() => {\n return () => {\n if (destroyOnUnmountRef.current && storage) {\n storage.destroy().catch((err) => handleCleanupError('useCreateStorage: error during unmount destroy', err))\n }\n }\n }, [storage])\n\n const isReady = status.status === StorageStatus.READY\n const isLoading = status.status === StorageStatus.LOADING\n const hasError = status.status === StorageStatus.ERROR\n\n if (isReady && storage) {\n return {\n storage,\n status,\n initialize,\n destroy,\n isReady: true as const,\n isLoading: false as const,\n hasError: false as const,\n }\n }\n\n return {\n storage: null,\n status,\n initialize,\n destroy,\n isReady: false as const,\n isLoading,\n hasError,\n }\n}\n"],"names":["useCallback","useEffect","useRef","useState","handleCleanupError","StorageFactory","StorageStatus","useCreateStorage","config","options","pluginExecutor","eventEmitter","logger","destroyDefault","autoInitialize","destroyOnUnmount","status","setStatus","storage","error","destroyOnUnmountRef","initialize","destroy","unsubscribe","newStatus","cancelled","err","isReady","isLoading","hasError"],"mappings":";;;;;;;AAAgE;AAEK;AAalD;AAmEnB,+EAA+E;AAExE,SAASO,gBAAgBA,CAC9BC,MAAiC,EACjCC,UAAoC,CAAC,CAAC,EACtCC,cAA2D,EAC3DC,YAA4B,EAC5BC,MAAgB;IAEhB,MAAMC,iBAAiBL,OAAO,IAAI,KAAK,cAAc,QAAQ;IAC7D,MAAM,EAAEM,iBAAiB,IAAI,EAAEC,mBAAmBF,cAAc,EAAE,GAAGJ;IAErE,MAAM,CAACO,QAAQC,UAAU,GAAGd,QAAQA,CAAoB;QACtD,QAAQG,kBAAkB;IAC5B;IAEA,MAAM,CAACY,QAAQ,GAAGf,QAAQA,CAAqB;QAC7C,IAAI;YACF,OAAOE,qBAAqB,CAAIG,QAAQE,gBAAgBC,cAAcC;QACxE,EAAE,OAAOO,OAAO;YACdF,UAAU;gBACR,QAAQX,mBAAmB;gBAC3B,OAAOa;YACT;YACA,OAAO;QACT;IACF;IAEA,MAAMC,sBAAsBlB,MAAMA,CAACa;IACnCK,oBAAoB,OAAO,GAAGL;IAE9B,MAAMM,aAAarB,WAAWA,CAAC;QAC7B,IAAI,CAACkB,SAAS;QAEd,IAAI;YACFD,UAAU;gBAAE,QAAQX,qBAAqB;YAAC;YAC1C,MAAMY,QAAQ,UAAU;YACxBD,UAAU;gBAAE,QAAQX,mBAAmB;YAAC;QAC1C,EAAE,OAAOa,OAAO;YACdF,UAAU;gBACR,QAAQX,mBAAmB;gBAC3B,OAAOa;YACT;QACF;IACF,GAAG;QAACD;KAAQ;IAEZ,MAAMI,UAAUtB,WAAWA,CAAC;QAC1B,IAAI,CAACkB,SAAS;QAEd,IAAI;YACF,MAAMA,QAAQ,OAAO;YACrBD,UAAU;gBAAE,QAAQX,kBAAkB;YAAC;QACzC,EAAE,OAAOa,OAAO;YACdF,UAAU;gBACR,QAAQX,mBAAmB;gBAC3B,OAAOa;YACT;QACF;IACF,GAAG;QAACD;KAAQ;IAEZjB,SAASA,CAAC;QACR,IAAI,CAACiB,SAAS;QAEd,MAAMK,cAAcL,QAAQ,cAAc,CAAC,CAACM;YAC1CP,UAAUO;QACZ;QAEA,OAAOD;IACT,GAAG;QAACL;KAAQ;IAEZ,+BAA+B;IAC/BjB,SAASA,CAAC;QACR,IAAIwB,YAAY;QAEhB,IAAIX,kBAAkBI,WAAWF,OAAO,MAAM,KAAKV,kBAAkB,EAAE;YACrEW,UAAU;gBAAE,QAAQX,qBAAqB;YAAC;YAC1CY,QACG,UAAU,GACV,IAAI,CAAC;gBACJ,IAAI,CAACO,WAAWR,UAAU;oBAAE,QAAQX,mBAAmB;gBAAC;YAC1D,GACC,KAAK,CAAC,CAACa;gBACN,IAAI,CAACM,WAAWR,UAAU;oBAAE,QAAQX,mBAAmB;oBAAE,OAAOa;gBAAe;YACjF;QACJ;QAEA,OAAO;YACLM,YAAY;QACd;IACF,GAAG;QAACX;QAAgBI;QAASF,OAAO,MAAM;KAAC;IAE3Cf,SAASA,CAAC;QACR,OAAO;YACL,IAAImB,oBAAoB,OAAO,IAAIF,SAAS;gBAC1CA,QAAQ,OAAO,GAAG,KAAK,CAAC,CAACQ,MAAQtB,kBAAkBA,CAAC,kDAAkDsB;YACxG;QACF;IACF,GAAG;QAACR;KAAQ;IAEZ,MAAMS,UAAUX,OAAO,MAAM,KAAKV,mBAAmB;IACrD,MAAMsB,YAAYZ,OAAO,MAAM,KAAKV,qBAAqB;IACzD,MAAMuB,WAAWb,OAAO,MAAM,KAAKV,mBAAmB;IAEtD,IAAIqB,WAAWT,SAAS;QACtB,OAAO;YACLA;YACAF;YACAK;YACAC;YACA,SAAS;YACT,WAAW;YACX,UAAU;QACZ;IACF;IAEA,OAAO;QACL,SAAS;QACTN;QACAK;QACAC;QACA,SAAS;QACTM;QACAC;IACF;AACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SelectorAPI } from '../../core';
|
|
2
|
+
interface UseSelectorOptions<T> {
|
|
3
|
+
/** Функция сравнения для предотвращения лишних ререндеров */
|
|
4
|
+
equals?: (a: T, b: T) => boolean;
|
|
5
|
+
/** Включать ли статус загрузки в возвращаемый результат */
|
|
6
|
+
withLoading?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Хук для использования селекторов в компонентах React.
|
|
10
|
+
* Использует useSyncExternalStore для корректной работы в Concurrent Mode.
|
|
11
|
+
* Подписывается напрямую через selector.subscribe() — без глобального реестра.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useSelector<T>(selector: SelectorAPI<T>): T;
|
|
14
|
+
export declare function useSelector<T>(selector: SelectorAPI<T>, options: UseSelectorOptions<T> & {
|
|
15
|
+
withLoading: true;
|
|
16
|
+
}): {
|
|
17
|
+
data: T;
|
|
18
|
+
isLoading: boolean;
|
|
19
|
+
};
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=useSelector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSelector.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useSelector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,UAAU,kBAAkB,CAAC,CAAC;IAC5B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;IAChC,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAC3D,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG;IAAE,WAAW,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAA"}
|