synapse-storage 4.0.1 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/utils/fetch-base-query.d.ts +20 -0
- package/dist/api/utils/fetch-base-query.d.ts.map +1 -1
- package/dist/api/utils/fetch-base-query.js +38 -2
- package/dist/api/utils/fetch-base-query.js.map +1 -1
- package/dist/core/storage/adapters/indexed-DB.service.d.ts +15 -0
- package/dist/core/storage/adapters/indexed-DB.service.d.ts.map +1 -1
- package/dist/core/storage/adapters/indexed-DB.service.js +39 -33
- package/dist/core/storage/adapters/indexed-DB.service.js.map +1 -1
- package/dist/react/hooks/useSelector.d.ts +15 -0
- package/dist/react/hooks/useSelector.d.ts.map +1 -1
- package/dist/react/hooks/useSelector.js +17 -1
- package/dist/react/hooks/useSelector.js.map +1 -1
- package/dist/react/utils/awaitSynapse.js +20 -4
- package/dist/react/utils/awaitSynapse.js.map +1 -1
- package/dist/react/utils/createSynapseCtx.d.ts.map +1 -1
- package/dist/react/utils/createSynapseCtx.js +53 -51
- package/dist/react/utils/createSynapseCtx.js.map +1 -1
- package/dist/reactive/dispatcher/standalone.d.ts +73 -4
- package/dist/reactive/dispatcher/standalone.d.ts.map +1 -1
- package/dist/reactive/dispatcher/standalone.js +103 -8
- package/dist/reactive/dispatcher/standalone.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive/dispatcher/standalone.js","sources":["../../../src/reactive/dispatcher/standalone.ts"],"sourcesContent":["import type { IStorage } from '../../core'\n\n// ────────────────────────────────────────────────────────────────────────────\n// Types\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Параметры исполнения действия (мемоизация)\n */\nexport interface ActionExecutionOptions<TParams, TResult> {\n memoize?: (currentArgs: TParams, previousArgs: TParams, previousResult: TResult) => boolean\n}\n\n/**\n * Рецепт действия — standalone-определение, не привязанное к хранилищу.\n * Привязывается к storage при регистрации в createDispatcher.\n */\nexport interface ActionRecipe<TState extends Record<string, any>, TParams, TResult> {\n readonly _type: 'action-recipe'\n readonly _config: {\n action: (storage: IStorage<TState>, params: TParams) => Promise<TResult> | TResult\n meta?: Record<string, any>\n }\n readonly _executionOptions?: ActionExecutionOptions<TParams, TResult>\n}\n\n/**\n * Рецепт watcher'а — standalone-определение, не привязанное к хранилищу.\n */\nexport interface WatcherRecipe<TState extends Record<string, any>, R> {\n readonly _type: 'watcher-recipe'\n readonly _config: {\n selector: (state: TState) => R\n meta?: Record<string, any>\n shouldTrigger?: (prev: R | undefined, current: R) => boolean\n notifyAfterSubscribe?: boolean\n }\n}\n\n/**\n * Состояние API-запроса для createApiActions\n */\nexport interface ApiRequestState {\n status: 'idle' | 'loading' | 'success' | 'error' | 'reset'\n error: string | null\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// defineAction\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Создаёт standalone-определение действия.\n * Фиксирует TState через первый вызов, TParams/TResult инферятся из action.\n *\n * @example\n * ```ts\n * const action = defineAction<MyState>()\n *\n * export const increment = action({\n * action: (storage, amount: number) => {\n * storage.update((s) => { s.count += amount })\n * return amount\n * },\n * })\n *\n * // Void action (без параметров и возврата):\n * export const reset = action({\n * action: (storage) => {\n * storage.update((s) => { s.count = 0 })\n * },\n * })\n * ```\n */\nexport function defineAction<TState extends Record<string, any>>() {\n return <TParams = void, TResult = void>(\n config: {\n action: (storage: IStorage<TState>, params: TParams) => Promise<TResult> | TResult\n meta?: Record<string, any>\n },\n executionOptions?: ActionExecutionOptions<TParams, TResult>,\n ): ActionRecipe<TState, TParams, TResult> => ({\n _type: 'action-recipe' as const,\n _config: config,\n _executionOptions: executionOptions,\n })\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// defineWatcher\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Создаёт standalone-определение watcher'а.\n *\n * @example\n * ```ts\n * export const watchCount = defineWatcher<MyState>()({\n * selector: (s) => s.items.length,\n * notifyAfterSubscribe: true,\n * })\n * ```\n */\nexport function defineWatcher<TState extends Record<string, any>>() {\n return <R>(config: {\n selector: (state: TState) => R\n meta?: Record<string, any>\n shouldTrigger?: (prev: R | undefined, current: R) => boolean\n notifyAfterSubscribe?: boolean\n }): WatcherRecipe<TState, R> => ({\n _type: 'watcher-recipe' as const,\n _config: config,\n })\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// createApiActions\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Вычисляет путь к свойству через Proxy-перехват обращений.\n */\nfunction resolvePath<T>(accessor: (draft: T) => any): string[] {\n const path: string[] = []\n const handler: ProxyHandler<any> = {\n get(_, prop) {\n if (typeof prop === 'string') {\n path.push(prop)\n }\n return new Proxy({}, handler)\n },\n }\n accessor(new Proxy({}, handler) as T)\n return path\n}\n\n/**\n * Записывает значение по пути в объекте.\n */\nfunction setByPath(obj: any, path: string[], value: any): void {\n let current = obj\n for (let i = 0; i < path.length - 1; i++) {\n current = current[path[i]]\n }\n current[path[path.length - 1]] = value\n}\n\n/**\n * Создаёт набор шаблонных lifecycle-действий для API-запроса.\n * Accessor указывает на поле ApiRequestState в стейте — путь вычисляется автоматически.\n *\n * @param accessor - Функция-accessor, указывающая на поле ApiRequestState в стейте\n *\n * @example\n * ```ts\n * const listRequest = createApiActions<MyState>(\n * (draft) => draft.api.listRequest\n * )\n *\n * // В dispatcher:\n * createDispatcher({ storage }, {\n * loadListInit: listRequest.init,\n * loadListLoading: listRequest.loading,\n * loadListSuccess: listRequest.success,\n * loadListFailure: listRequest.failure,\n * loadListReset: listRequest.reset,\n * })\n * ```\n */\nexport function createApiActions<TState extends Record<string, any>>(accessor: (draft: TState) => ApiRequestState) {\n const path = resolvePath(accessor)\n const action = defineAction<TState>()\n\n const update = (storage: IStorage<TState>, request: ApiRequestState) => {\n storage.update((s) => setByPath(s, path, request))\n }\n\n return {\n init: action({\n action: (storage) => update(storage, { status: 'idle', error: null }),\n }),\n\n loading: action({\n action: (storage) => update(storage, { status: 'loading', error: null }),\n }),\n\n success: action({\n action: (storage) => update(storage, { status: 'success', error: null }),\n }),\n\n failure: action({\n action: (storage, error: string) => update(storage, { status: 'error', error }),\n }),\n\n reset: action({\n action: (storage) => update(storage, { status: 'reset', error: null }),\n }),\n }\n}\n"],"names":["defineAction","config","executionOptions","defineWatcher","resolvePath","accessor","path","handler","_","prop","Proxy","setByPath","obj","value","current","i","createApiActions","action","update","storage","request","s","error"],"mappings":"AA+CA,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;CAsBC,GACM,SAASA,YAAYA;IAC1B,OAAO,CACLC,QAIAC,mBAC4C;YAC5C,OAAO;YACP,SAASD;YACT,mBAAmBC;QACrB;AACF;AAEA,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;;;;;;;;;CAUC,GACM,SAASC,aAAaA;IAC3B,OAAO,CAAIF,SAKsB;YAC/B,OAAO;YACP,SAASA;QACX;AACF;AAEA,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;CAEC,GACD,SAASG,WAAWA,CAAIC,QAA2B;IACjD,MAAMC,OAAiB,EAAE;IACzB,MAAMC,UAA6B;QACjC,KAAIC,CAAC,EAAEC,IAAI;YACT,IAAI,OAAOA,SAAS,UAAU;gBAC5BH,KAAK,IAAI,CAACG;YACZ;YACA,OAAO,IAAIC,MAAM,CAAC,GAAGH;QACvB;IACF;IACAF,SAAS,IAAIK,MAAM,CAAC,GAAGH;IACvB,OAAOD;AACT;AAEA;;CAEC,GACD,SAASK,SAASA,CAACC,GAAQ,EAAEN,IAAc,EAAEO,KAAU;IACrD,IAAIC,UAAUF;IACd,IAAK,IAAIG,IAAI,GAAGA,IAAIT,KAAK,MAAM,GAAG,GAAGS,IAAK;QACxCD,UAAUA,OAAO,CAACR,IAAI,CAACS,EAAE,CAAC;IAC5B;IACAD,OAAO,CAACR,IAAI,CAACA,KAAK,MAAM,GAAG,EAAE,CAAC,GAAGO;AACnC;AAEA;;;;;;;;;;;;;;;;;;;;;CAqBC,GACM,SAASG,gBAAgBA,CAAqCX,QAA4C;IAC/G,MAAMC,OAAOF,WAAWA,CAACC;IACzB,MAAMY,SAASjB,YAAYA;IAE3B,MAAMkB,SAAS,CAACC,SAA2BC;QACzCD,QAAQ,MAAM,CAAC,CAACE,IAAMV,SAASA,CAACU,GAAGf,MAAMc;IAC3C;IAEA,OAAO;QACL,MAAMH,OAAO;YACX,QAAQ,CAACE,UAAYD,OAAOC,SAAS;oBAAE,QAAQ;oBAAQ,OAAO;gBAAK;QACrE;QAEA,SAASF,OAAO;YACd,QAAQ,CAACE,UAAYD,OAAOC,SAAS;oBAAE,QAAQ;oBAAW,OAAO;gBAAK;QACxE;QAEA,SAASF,OAAO;YACd,QAAQ,CAACE,UAAYD,OAAOC,SAAS;oBAAE,QAAQ;oBAAW,OAAO;gBAAK;QACxE;QAEA,SAASF,OAAO;YACd,QAAQ,CAACE,SAASG,QAAkBJ,OAAOC,SAAS;oBAAE,QAAQ;oBAASG;gBAAM;QAC/E;QAEA,OAAOL,OAAO;YACZ,QAAQ,CAACE,UAAYD,OAAOC,SAAS;oBAAE,QAAQ;oBAAS,OAAO;gBAAK;QACtE;IACF;AACF"}
|
|
1
|
+
{"version":3,"file":"reactive/dispatcher/standalone.js","sources":["../../../src/reactive/dispatcher/standalone.ts"],"sourcesContent":["import type { IStorage } from '../../core'\n\n// ────────────────────────────────────────────────────────────────────────────\n// Types\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Параметры исполнения действия (мемоизация)\n */\nexport interface ActionExecutionOptions<TParams, TResult> {\n memoize?: (currentArgs: TParams, previousArgs: TParams, previousResult: TResult) => boolean\n}\n\n/**\n * Рецепт действия — standalone-определение, не привязанное к хранилищу.\n * Привязывается к storage при регистрации в createDispatcher.\n */\nexport interface ActionRecipe<TState extends Record<string, any>, TParams, TResult> {\n readonly _type: 'action-recipe'\n readonly _config: {\n action: (storage: IStorage<TState>, params: TParams) => Promise<TResult> | TResult\n meta?: Record<string, any>\n }\n readonly _executionOptions?: ActionExecutionOptions<TParams, TResult>\n}\n\n/**\n * Рецепт watcher'а — standalone-определение, не привязанное к хранилищу.\n */\nexport interface WatcherRecipe<TState extends Record<string, any>, R> {\n readonly _type: 'watcher-recipe'\n readonly _config: {\n selector: (state: TState) => R\n meta?: Record<string, any>\n shouldTrigger?: (prev: R | undefined, current: R) => boolean\n notifyAfterSubscribe?: boolean\n }\n}\n\n/**\n * Статусы жизненного цикла API-запроса.\n *\n * Сделано const-объектом (а не TS `enum`) намеренно: значения остаются обычными\n * строковыми литералами, поэтому `ApiStatus.Loading` и строка `'loading'`\n * взаимозаменяемы и тип обратно совместим с прежним строковым union'ом. С `enum`\n * это не так — его член не присваивается к литералу и наоборот.\n *\n * `ApiStatus` — одновременно значение (для `ApiStatus.Loading` в коде) и тип\n * (union всех статусов).\n */\nexport const ApiStatus = {\n Idle: 'idle',\n Loading: 'loading',\n Success: 'success',\n Error: 'error',\n Reset: 'reset',\n} as const\n\nexport type ApiStatus = (typeof ApiStatus)[keyof typeof ApiStatus]\n\n/**\n * Состояние API-запроса для createApiActions / createKeyedApiActions\n */\nexport interface ApiRequestState {\n status: ApiStatus\n error: string | null\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// defineAction\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Создаёт standalone-определение действия.\n * Фиксирует TState через первый вызов, TParams/TResult инферятся из action.\n *\n * @example\n * ```ts\n * const action = defineAction<MyState>()\n *\n * export const increment = action({\n * action: (storage, amount: number) => {\n * storage.update((s) => { s.count += amount })\n * return amount\n * },\n * })\n *\n * // Void action (без параметров и возврата):\n * export const reset = action({\n * action: (storage) => {\n * storage.update((s) => { s.count = 0 })\n * },\n * })\n * ```\n */\nexport function defineAction<TState extends Record<string, any>>() {\n return <TParams = void, TResult = void>(\n config: {\n action: (storage: IStorage<TState>, params: TParams) => Promise<TResult> | TResult\n meta?: Record<string, any>\n },\n executionOptions?: ActionExecutionOptions<TParams, TResult>,\n ): ActionRecipe<TState, TParams, TResult> => ({\n _type: 'action-recipe' as const,\n _config: config,\n _executionOptions: executionOptions,\n })\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// defineWatcher\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Создаёт standalone-определение watcher'а.\n *\n * @example\n * ```ts\n * export const watchCount = defineWatcher<MyState>()({\n * selector: (s) => s.items.length,\n * notifyAfterSubscribe: true,\n * })\n * ```\n */\nexport function defineWatcher<TState extends Record<string, any>>() {\n return <R>(config: {\n selector: (state: TState) => R\n meta?: Record<string, any>\n shouldTrigger?: (prev: R | undefined, current: R) => boolean\n notifyAfterSubscribe?: boolean\n }): WatcherRecipe<TState, R> => ({\n _type: 'watcher-recipe' as const,\n _config: config,\n })\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// createApiActions\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Вычисляет путь к свойству через Proxy-перехват обращений.\n */\nfunction resolvePath<T>(accessor: (draft: T) => any): string[] {\n const path: string[] = []\n const handler: ProxyHandler<any> = {\n get(_, prop) {\n if (typeof prop === 'string') {\n path.push(prop)\n }\n return new Proxy({}, handler)\n },\n }\n accessor(new Proxy({}, handler) as T)\n return path\n}\n\n/**\n * Записывает значение по пути в объекте.\n */\nfunction setByPath(obj: any, path: string[], value: any): void {\n let current = obj\n for (let i = 0; i < path.length - 1; i++) {\n current = current[path[i]]\n }\n current[path[path.length - 1]] = value\n}\n\n/**\n * Создаёт набор шаблонных lifecycle-действий для API-запроса.\n * Accessor указывает на поле ApiRequestState в стейте — путь вычисляется автоматически.\n *\n * @param accessor - Функция-accessor, указывающая на поле ApiRequestState в стейте\n *\n * @typeParam TInitPayload - Тип payload'а `init`-экшена. По умолчанию `void`\n * (init без параметров). Если задать — `init` принимает payload и возвращает\n * его, что удобно для intent-паттерна: эффект слушает `init` и читает payload\n * намерения (target, фильтры и т.п.), а статус при этом сбрасывается в `idle`.\n *\n * @example\n * ```ts\n * const listRequest = createApiActions<MyState>(\n * (draft) => draft.api.listRequest\n * )\n *\n * // В dispatcher:\n * createDispatcher({ storage }, {\n * loadListInit: listRequest.init,\n * loadListLoading: listRequest.loading,\n * loadListSuccess: listRequest.success,\n * loadListFailure: listRequest.failure,\n * loadListReset: listRequest.reset,\n * })\n *\n * // init с payload (intent): эффект получит { entityId } из возврата экшена.\n * const usersReq = createApiActions<MyState, { entityId: string }>(\n * (draft) => draft.api.usersRequest\n * )\n * ```\n */\nexport function createApiActions<TState extends Record<string, any>, TInitPayload = void>(accessor: (draft: TState) => ApiRequestState) {\n const path = resolvePath(accessor)\n const action = defineAction<TState>()\n\n const update = (storage: IStorage<TState>, request: ApiRequestState) => {\n storage.update((s) => setByPath(s, path, request))\n }\n\n return {\n init: action<TInitPayload, TInitPayload>({\n // Сбрасываем статус в idle и пробрасываем payload намерения дальше (эффектам).\n action: (storage, payload: TInitPayload) => {\n update(storage, { status: ApiStatus.Idle, error: null })\n return payload\n },\n }),\n\n loading: action({\n action: (storage) => update(storage, { status: ApiStatus.Loading, error: null }),\n }),\n\n success: action({\n action: (storage) => update(storage, { status: ApiStatus.Success, error: null }),\n }),\n\n failure: action({\n action: (storage, error: string) => update(storage, { status: ApiStatus.Error, error }),\n }),\n\n reset: action({\n action: (storage) => update(storage, { status: ApiStatus.Reset, error: null }),\n }),\n }\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// createKeyedApiActions\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Keyed-вариант createApiActions: статус хранится ПО КЛЮЧУ в `Record<string,\n * ApiRequestState>`, а не один на весь запрос. Нужен, когда один и тот же запрос\n * летит параллельно для нескольких независимых ключей и у каждого свой\n * loading/error: комменты по таргетам, детали сущностей по id, per-row действия\n * в таблице/ленте, пагинация по секциям — всё, что лежит как `Record<key, data>`.\n *\n * Все статус-экшены принимают `key` (и возвращают его — удобно эффектам), кроме\n * `failure`, который принимает `{ key, error }`. Записи мутируются иммутабельно\n * по одному ключу — соседние ключи (их срезы) по ссылке не затрагиваются, что и\n * нужно для гранулярной изоляции ре-рендеров (см. useKeyedSliceSelector).\n *\n * @param accessor - Функция-accessor, указывающая на поле `Record<string, ApiRequestState>`\n *\n * @example\n * ```ts\n * const commentsReq = createKeyedApiActions<MyState>((d) => d.api.commentsRequest)\n *\n * createDispatcher({ storage }, {\n * commentsInit: commentsReq.init, // (key) => key\n * commentsLoading: commentsReq.loading, // (key) => key\n * commentsSuccess: commentsReq.success, // (key) => key\n * commentsFailure: commentsReq.failure, // ({ key, error })\n * commentsReset: commentsReq.reset, // (key) => key\n * })\n * ```\n */\nexport function createKeyedApiActions<TState extends Record<string, any>>(accessor: (draft: TState) => Record<string, ApiRequestState>) {\n const path = resolvePath(accessor)\n const action = defineAction<TState>()\n\n const write = (storage: IStorage<TState>, key: string, request: ApiRequestState) => {\n // [...path, key] → setByPath доходит до самого Record и кладёт значение по ключу\n storage.update((s) => setByPath(s, [...path, key], request))\n }\n\n const writer = (status: ApiStatus) =>\n action<string, string>({\n action: (storage, key: string) => {\n write(storage, key, { status, error: null })\n return key\n },\n })\n\n return {\n init: writer(ApiStatus.Idle),\n loading: writer(ApiStatus.Loading),\n success: writer(ApiStatus.Success),\n reset: writer(ApiStatus.Reset),\n\n failure: action<{ key: string; error: string }, { key: string; error: string }>({\n action: (storage, payload: { key: string; error: string }) => {\n write(storage, payload.key, { status: ApiStatus.Error, error: payload.error })\n return payload\n },\n }),\n }\n}\n"],"names":["ApiStatus","defineAction","config","executionOptions","defineWatcher","resolvePath","accessor","path","handler","_","prop","Proxy","setByPath","obj","value","current","i","createApiActions","action","update","storage","request","s","payload","error","createKeyedApiActions","write","key","writer","status"],"mappings":"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"}
|