@yunu-lab/rpc-react
Version:
π **React + RPC = β€οΈ**
1 lines β’ 54 kB
Source Map (JSON)
{"version":3,"file":"index.es","sources":["../src/store/extendStore.ts","../src/providers/RpcStoreProvider.tsx","../src/hooks/useRpc.ts","../src/hooks/createRpcHooks.ts","../src/hooks/useInlineRpcStore.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Store,\n combineReducers,\n createSlice,\n PayloadAction,\n} from \"@reduxjs/toolkit\";\nimport { RpcRepository } from \"@yunu-lab/rpc-ts\";\n\nexport interface ExtendStoreOptions {\n repository: RpcRepository<any>;\n store: Store;\n slices?: Record<string, any>;\n}\n\nexport const extendStore = (options: ExtendStoreOptions) => {\n const { repository, store, slices = {} } = options;\n\n const rpcSlice = createSlice({\n name: \"rpc\",\n initialState: {} as Record<string, any>,\n reducers: {\n setData: (\n state,\n action: PayloadAction<{\n type: string;\n data: any;\n }>\n ) => {\n const { type, data } = action.payload;\n state[type] = data;\n },\n },\n });\n\n const newReducer = combineReducers({\n ...slices,\n rpc: rpcSlice.reducer,\n });\n\n store.replaceReducer(newReducer);\n\n const unsubscribe = repository.onDataChanged((events) => {\n events.forEach((event) => {\n const { type, payload } = event;\n\n const storageType = repository.getStorageType(String(type));\n\n if (storageType === \"singleton\") {\n const nextValue = Array.isArray(payload)\n ? payload[0] ?? null\n : payload ?? null;\n store.dispatch(\n rpcSlice.actions.setData({\n type: String(type),\n data: nextValue,\n })\n );\n } else {\n const nextArray = Array.isArray(payload)\n ? payload\n : Object.values(payload || {});\n store.dispatch(\n rpcSlice.actions.setData({\n type: String(type),\n data: nextArray,\n })\n );\n }\n });\n });\n\n return {\n store,\n repository,\n unsubscribe,\n };\n};\n","import React from \"react\";\nimport { RpcRepository } from \"@yunu-lab/rpc-ts\";\nimport { createContext } from \"react\";\n\nconst RpcContext = createContext<{\n repository: RpcRepository;\n} | null>(null);\n\nexport interface RpcProviderProps {\n children: React.ReactNode;\n repository: RpcRepository;\n}\n\nexport const RpcProvider: React.FC<RpcProviderProps> = ({\n children,\n repository,\n}) => {\n return (\n <RpcContext.Provider value={{ repository }}>\n {children}\n </RpcContext.Provider>\n );\n};\n\nexport { RpcContext }; ","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useContext } from \"react\";\nimport { Rpc, RpcRepository } from \"@yunu-lab/rpc-ts\";\nimport { RpcContext } from \"../providers/RpcStoreProvider\";\n\nexport interface RpcContextType<TTypes extends Record<string, Rpc<any>>> {\n repository: RpcRepository<TTypes>;\n}\n\nexport const useRpc = <\n TTypes extends Record<string, Rpc<any>>\n>(): RpcContextType<TTypes> => {\n const context = useContext(RpcContext);\n\n if (!context) {\n throw new Error(\"useRpc must be used within an RpcProvider\");\n }\n\n const repository = React.useMemo(\n () => context.repository as unknown as RpcRepository<TTypes>,\n [context.repository]\n );\n\n return {\n repository\n };\n};","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Message, Rpc, StorageType } from \"@yunu-lab/rpc-ts\";\nimport React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { z } from \"zod\";\nimport { useRpc } from \"./useRpc\";\n\ntype InferRpcType<T> = T extends Rpc<infer S> ? z.infer<S> : never;\n\nconst toPascalCase = (s: string): string => {\n\treturn s\n\t\t.split(\"_\")\n\t\t.map(\n\t\t\t(word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t)\n\t\t.join(\"\");\n};\n\ntype ToPascalCase<S extends string> = S extends `${infer First}_${infer Rest}`\n\t? `${Capitalize<First>}${ToPascalCase<Rest>}`\n\t: Capitalize<S>;\n\ninterface RpcState<TTypes extends Record<string, Rpc<any>>> {\n\trpc: {\n\t\t[K in keyof TTypes]?: any;\n\t};\n}\n\ntype RpcHooks<\n\tTTypes extends Record<string, Rpc<any>>,\n\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\tkeyof TTypes,\n\t\tStorageType\n\t>\n> = {\n\t// ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Ρ
ΡΠΊΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°\n\t[K in keyof TTypes as `use${ToPascalCase<string & K>}`]: {\n\t\t(): {\n\t\t\t[P in K as `${P & string}s`]: RpcStorageType[P] extends \"collection\"\n\t\t\t\t? InferRpcType<TTypes[P]>[]\n\t\t\t\t: RpcStorageType[P] extends \"singleton\"\n\t\t\t\t? InferRpcType<TTypes[P]> | null\n\t\t\t\t: InferRpcType<TTypes[P]>[];\n\t\t} & {\n\t\t\t[P in K as `${P &\n\t\t\t\tstring}Map`]: RpcStorageType[P] extends \"collection\"\n\t\t\t\t? Record<string, InferRpcType<TTypes[P]>>\n\t\t\t\t: RpcStorageType[P] extends \"singleton\"\n\t\t\t\t? InferRpcType<TTypes[P]> | null\n\t\t\t\t: Record<string, InferRpcType<TTypes[P]>>;\n\t\t} & {\n\t\t\tfindById: (id: string | number) => InferRpcType<TTypes[K]> | null;\n\t\t\tfindAll: () => InferRpcType<TTypes[K]>[];\n\t\t\tmergeRpc: {\n\t\t\t\t(\n\t\t\t\t\tdata:\n\t\t\t\t\t\t| Record<\n\t\t\t\t\t\t string,\n\t\t\t\t\t\t Partial<InferRpcType<TTypes[K]>> | null\n\t\t\t\t\t >\n\t\t\t\t\t\t| InferRpcType<TTypes[K]>[]\n\t\t\t\t\t\t| Partial<InferRpcType<TTypes[K]>>\n\t\t\t\t): InferRpcType<TTypes[K]>[];\n\t\t\t\t<RpcStorageType extends Record<keyof TTypes, StorageType>>(\n\t\t\t\t\tdata: RpcStorageType[K] extends \"collection\"\n\t\t\t\t\t\t?\n\t\t\t\t\t\t | Record<\n\t\t\t\t\t\t string,\n\t\t\t\t\t\t Partial<InferRpcType<TTypes[K]>> | null\n\t\t\t\t\t\t >\n\t\t\t\t\t\t | InferRpcType<TTypes[K]>[]\n\t\t\t\t\t\t: RpcStorageType[K] extends \"singleton\"\n\t\t\t\t\t\t? Partial<InferRpcType<TTypes[K]>>\n\t\t\t\t\t\t: never\n\t\t\t\t): InferRpcType<TTypes[K]>[];\n\t\t\t};\n\t\t\tclear: () => void;\n\t\t};\n\t\t(id: string | number): InferRpcType<TTypes[K]> | null;\n\t};\n} & {\n\t// Π₯ΡΠΊΠΈ Π΄Π»Ρ ΠΏΠΎΠ»Π½ΡΡ
ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
\n\t[K in keyof TTypes as `use${ToPascalCase<string & K>}FullRelatedData`]: <\n\t\tTResult = InferRpcType<TTypes[K]>\n\t>(\n\t\tid?: string | number\n\t) => TResult | TResult[] | null;\n} & {\n\t// Π₯ΡΠΊΠΈ Π΄Π»Ρ ΡΠ»ΡΡΠ°ΡΠ΅Π»Π΅ΠΉ Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠ΅ΠΉ\n\t[K in keyof TTypes as `use${ToPascalCase<string & K>}Listener`]: <\n\t\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\t\tkeyof TTypes,\n\t\t\tStorageType\n\t\t>\n\t>(\n\t\tcallback: (event: {\n\t\t\ttype: K;\n\t\t\tpayload: RpcStorageType[K] extends \"collection\"\n\t\t\t\t? Array<InferRpcType<TTypes[K]>>\n\t\t\t\t: RpcStorageType[K] extends \"singleton\"\n\t\t\t\t? InferRpcType<TTypes[K]>\n\t\t\t\t: Array<InferRpcType<TTypes[K]>>;\n\t\t}) => void\n\t) => () => void;\n} & {\n\t// ΠΠ±ΡΠΈΠΉ ΡΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π΄Π°Π½Π½ΡΡ
\n\tuseDataListener: <\n\t\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\t\tkeyof TTypes,\n\t\t\tStorageType\n\t\t>\n\t>(\n\t\tcallback: (\n\t\t\tevents: Array<{\n\t\t\t\ttype: keyof TTypes;\n\t\t\t\tpayload: RpcStorageType[keyof TTypes] extends \"collection\"\n\t\t\t\t\t? Array<InferRpcType<TTypes[keyof TTypes]>>\n\t\t\t\t\t: RpcStorageType[keyof TTypes] extends \"singleton\"\n\t\t\t\t\t? InferRpcType<TTypes[keyof TTypes]>\n\t\t\t\t\t: Array<InferRpcType<TTypes[keyof TTypes]>>;\n\t\t\t}>\n\t\t) => void,\n\t\toptions?: { types?: (keyof TTypes)[] }\n\t) => () => void;\n} & {\n\t// Π₯ΡΠΊΠΈ Π΄Π»Ρ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
\n\t[K in keyof TTypes as `use${ToPascalCase<string & K>}Related`]: <\n\t\tTTarget extends keyof TTypes\n\t>(\n\t\tid: string | number,\n\t\ttargetType: TTarget\n\t) => Array<TTypes[TTarget] extends Rpc<infer S> ? z.infer<S> : never>;\n} & {\n\t// Π₯ΡΠΊ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠ»Π½ΠΎΠΉ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠ΅ΠΉ\n\tuseHandleMessages: () => {\n\t\thandleMessages<\n\t\t\tRpcStorageType extends Record<keyof TTypes, StorageType>\n\t\t>(\n\t\t\tmessages: Array<Message<TTypes>>,\n\t\t\tcallbacks?: {\n\t\t\t\t[K in keyof TTypes]?: (\n\t\t\t\t\tdata: RpcStorageType[K] extends \"collection\"\n\t\t\t\t\t\t?\n\t\t\t\t\t\t | Record<\n\t\t\t\t\t\t string,\n\t\t\t\t\t\t Partial<InferRpcType<TTypes[K]>> | null\n\t\t\t\t\t\t >\n\t\t\t\t\t\t | Array<InferRpcType<TTypes[K]>>\n\t\t\t\t\t\t: RpcStorageType[K] extends \"singleton\"\n\t\t\t\t\t\t? Partial<InferRpcType<TTypes[K]>>\n\t\t\t\t\t\t: never\n\t\t\t\t) => void;\n\t\t\t}\n\t\t): void;\n\t};\n};\n\nexport const createRpcHooks = <\n\tTTypes extends Record<string, Rpc<any>>,\n\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\tkeyof TTypes,\n\t\tStorageType\n\t>\n>(\n\ttypeKeys: Array<keyof TTypes>\n): RpcHooks<TTypes, RpcStorageType> => {\n\tconst EMPTY_MAP: Record<string, unknown> = Object.freeze({});\n\n\tconst hooks = {} as RpcHooks<TTypes, RpcStorageType>;\n\n\t// ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Ρ
ΡΠΊΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°\n\ttypeKeys.forEach((typeName) => {\n\t\tconst hookName = `use${toPascalCase(\n\t\t\tString(typeName)\n\t\t)}` as keyof RpcHooks<TTypes>;\n\t\tconst typeKey = typeName as keyof TTypes;\n\n\t\tfunction useHook(id?: string | number) {\n\t\t\tconst { repository } = useRpc<TTypes>();\n\t\t\tconst allData = useSelector(\n\t\t\t\t(state: RpcState<TTypes>) => (state.rpc[typeKey] as unknown) ?? EMPTY_MAP\n\t\t\t) as any;\n\n\t\t\tconst storageType = (repository as any).getStorageType?.(\n\t\t\t\tString(typeKey)\n\t\t\t);\n\n\t\t\tconst list = React.useMemo(() => {\n\t\t\t\tif (storageType === \"singleton\") return [] as Array<\n\t\t\t\t\tInferRpcType<TTypes[typeof typeKey]>\n\t\t\t\t>;\n\t\t\t\tif (Array.isArray(allData)) {\n\t\t\t\t\treturn allData as Array<InferRpcType<TTypes[typeof typeKey]>>;\n\t\t\t\t}\n\t\t\t\treturn Object.values(allData || {}) as Array<\n\t\t\t\t\tInferRpcType<TTypes[typeof typeKey]>\n\t\t\t\t>;\n\t\t\t}, [allData, storageType]);\n\n\t\t\tconst findById = React.useCallback(\n\t\t\t\t(id: string | number) => repository.findById(typeKey, id),\n\t\t\t\t[repository]\n\t\t\t);\n\t\t\tconst findAll = React.useCallback(\n\t\t\t\t() => repository.findAll(typeKey),\n\t\t\t\t[repository]\n\t\t\t);\n\t\t\tconst mergeRpc = React.useCallback(\n\t\t\t\t(\n\t\t\t\t\tdata:\n\t\t\t\t\t\t| Record<\n\t\t\t\t\t\t string,\n\t\t\t\t\t\t Partial<\n\t\t\t\t\t\t InferRpcType<TTypes[typeof typeKey]>\n\t\t\t\t\t\t > | null\n\t\t\t\t\t\t >\n\t\t\t\t\t\t| InferRpcType<TTypes[typeof typeKey]>[]\n\t\t\t\t\t\t| Partial<InferRpcType<TTypes[typeof typeKey]>>\n\t\t\t\t) => {\n\t\t\t\t\trepository.mergeRpc(typeKey, data);\n\t\t\t\t},\n\t\t\t\t[repository]\n\t\t\t);\n\n\t\t\tconst clear = React.useCallback(() => {\n\t\t\t\trepository.clear(typeKey);\n\t\t\t}, [repository]);\n\n\t\t\tconst dataForKey =\n\t\t\t\tstorageType === \"singleton\"\n\t\t\t\t\t? ((allData ?? null) as InferRpcType<\n\t\t\t\t\t\t\tTTypes[typeof typeKey]\n\t\t\t\t\t > | null)\n\t\t\t\t\t: list;\n\n\t\t\tconst mapForKey = React.useMemo(() => {\n\t\t\t\tif (storageType === \"singleton\") {\n\t\t\t\t\treturn (allData ?? null) as InferRpcType<\n\t\t\t\t\t\tTTypes[typeof typeKey]\n\t\t\t\t\t> | null;\n\t\t\t\t}\n\t\t\t\tconst record: Record<string, InferRpcType<TTypes[typeof typeKey]>> = {} as any;\n\t\t\t\tfor (const item of list as Array<any>) {\n\t\t\t\t\tif (item && (\"id\" in item)) {\n\t\t\t\t\t\trecord[String((item as any).id)] = item as any;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn record;\n\t\t\t}, [allData, list, storageType]);\n\n\t\t\tif (id !== undefined) {\n\t\t\t\treturn findById(id);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t[`${String(typeKey)}s`]: dataForKey,\n\t\t\t\t[`${String(typeKey)}Map`]: mapForKey,\n\t\t\t\tfindById,\n\t\t\t\tfindAll,\n\t\t\t\tmergeRpc,\n\t\t\t\tclear,\n\t\t\t} as any;\n\t\t}\n\n\t\t(hooks as any)[hookName] = useHook;\n\n\t\tconst fullRelatedHookName = `use${toPascalCase(\n\t\t\tString(typeName)\n\t\t)}FullRelatedData` as keyof RpcHooks<TTypes>;\n\n\t\tfunction useFullRelatedHook<\n\t\t\tTResult = InferRpcType<TTypes[typeof typeName]>\n\t\t>(id?: string | number) {\n\t\t\tconst { repository } = useRpc<TTypes>();\n\t\t\tconst allRpcData = useSelector(\n\t\t\t\t(state: RpcState<TTypes>) => state.rpc\n\t\t\t);\n\n\t\t\tconst rpcVersion = React.useMemo(() => {\n\t\t\t\treturn Object.keys(allRpcData).length;\n\t\t\t}, [allRpcData]);\n\n\t\t\tconst fullData = React.useMemo(() => {\n\t\t\t\tvoid rpcVersion;\n\t\t\t\ttry {\n\t\t\t\t\treturn (repository as any).getFullRelatedData(\n\t\t\t\t\t\ttypeName,\n\t\t\t\t\t\tid\n\t\t\t\t\t) as TResult | TResult[] | null;\n\t\t\t\t} catch {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}, [repository, id, rpcVersion]);\n\n\t\t\treturn fullData;\n\t\t}\n\t\t(hooks as any)[fullRelatedHookName] = useFullRelatedHook;\n\t});\n\n\ttypeKeys.forEach((typeName) => {\n\t\tconst listenerHookName = `use${toPascalCase(\n\t\t\tString(typeName)\n\t\t)}Listener` as keyof RpcHooks<TTypes>;\n\n\t\tfunction useListenerHook<\n\t\t\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\t\t\tkeyof TTypes,\n\t\t\t\tStorageType\n\t\t\t>\n\t\t>(\n\t\t\tcallback: (event: {\n\t\t\t\ttype: typeof typeName;\n\t\t\t\tpayload: RpcStorageType[typeof typeName] extends \"collection\"\n\t\t\t\t\t? Array<InferRpcType<TTypes[typeof typeName]>>\n\t\t\t\t\t: RpcStorageType[typeof typeName] extends \"singleton\"\n\t\t\t\t\t? InferRpcType<TTypes[typeof typeName]>\n\t\t\t\t\t: Array<InferRpcType<TTypes[typeof typeName]>>;\n\t\t\t}) => void\n\t\t) {\n\t\t\tconst { repository } = useRpc<TTypes>();\n\t\t\tconst callbackRef = React.useRef(callback);\n\t\t\tconst listenerIdRef = React.useRef<string | number | null>(null);\n\t\t\tcallbackRef.current = callback;\n\n\t\t\t// ΠΡΡΠΈΡΡΠ΅ΠΌ ΡΠΈΠΏ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°\n\t\t\tconst storageType = React.useMemo(() => {\n\t\t\t\treturn (repository as any).getStorageType?.(String(typeName));\n\t\t\t}, [repository]);\n\n\t\t\tconst invoke = React.useCallback(\n\t\t\t\t(\n\t\t\t\t\tevents: Array<{\n\t\t\t\t\t\ttype: typeof typeName;\n\t\t\t\t\t\tpayload: any;\n\t\t\t\t\t}>\n\t\t\t\t) => {\n\t\t\t\t\tif (!events || events.length === 0) return;\n\t\t\t\t\tconst event = events[0];\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tstorageType === \"singleton\" &&\n\t\t\t\t\t\tArray.isArray(event.payload) &&\n\t\t\t\t\t\tevent.payload.length > 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst singletonEvent = {\n\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\tpayload: event.payload[0],\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcallbackRef.current(singletonEvent as any);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcallbackRef.current(event as any);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[storageType]\n\t\t\t);\n\n\t\t\tReact.useEffect(() => {\n\t\t\t\tif (\n\t\t\t\t\tlistenerIdRef.current &&\n\t\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t\t) {\n\t\t\t\t\t(repository as any).offDataChanged(listenerIdRef.current);\n\t\t\t\t\tlistenerIdRef.current = null;\n\t\t\t\t}\n\n\t\t\t\tlistenerIdRef.current = (repository as any).onDataChanged(\n\t\t\t\t\tinvoke,\n\t\t\t\t\t{\n\t\t\t\t\t\ttypes: [typeName],\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\treturn () => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tlistenerIdRef.current &&\n\t\t\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t\t\t) {\n\t\t\t\t\t\t(repository as any).offDataChanged(\n\t\t\t\t\t\t\tlistenerIdRef.current\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlistenerIdRef.current = null;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}, [repository, invoke]);\n\t\t\t// ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΡΡΠ½ΠΎΠΉ ΠΎΡΠΏΠΈΡΠΊΠΈ\n\t\t\treturn () => {\n\t\t\t\tif (\n\t\t\t\t\tlistenerIdRef.current &&\n\t\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t\t) {\n\t\t\t\t\t(repository as any).offDataChanged(listenerIdRef.current);\n\t\t\t\t\tlistenerIdRef.current = null;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\t(hooks as any)[listenerHookName] = useListenerHook;\n\t});\n\n\tfunction useDataListener<\n\t\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\t\tkeyof TTypes,\n\t\t\tStorageType\n\t\t>\n\t>(\n\t\tcallback: (\n\t\t\tevents: Array<{\n\t\t\t\ttype: keyof TTypes;\n\t\t\t\tpayload: RpcStorageType[keyof TTypes] extends \"collection\"\n\t\t\t\t\t? Array<InferRpcType<TTypes[keyof TTypes]>>\n\t\t\t\t\t: RpcStorageType[keyof TTypes] extends \"singleton\"\n\t\t\t\t\t? InferRpcType<TTypes[keyof TTypes]>\n\t\t\t\t\t: Array<InferRpcType<TTypes[keyof TTypes]>>;\n\t\t\t}>\n\t\t) => void,\n\t\toptions?: { types?: (keyof TTypes)[] }\n\t) {\n\t\tconst { repository } = useRpc<TTypes>();\n\t\tconst callbackRef = React.useRef(callback);\n\t\tconst listenerIdRef = React.useRef<string | number | null>(null);\n\t\tcallbackRef.current = callback;\n\n\t\tconst types = (options?.types || typeKeys) as Array<keyof TTypes>;\n\n\t\t// Π‘ΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΠΏΠΎΠ² ΡΠ΅ΡΠ΅Π· ΠΊΠ»ΡΡ-ΡΡΡΠΎΠΊΡ\n\t\tconst typesKey = React.useMemo(() => {\n\t\t\tconst sorted = [...types].sort();\n\t\t\treturn sorted.join(\",\");\n\t\t}, [types]);\n\n\t\tconst stableTypes = React.useMemo(() => {\n\t\t\t// ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ typesKey Π΄Π»Ρ ΠΈΠ½Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ\n\t\t\tvoid typesKey;\n\t\t\treturn options?.types || typeKeys;\n\t\t}, [typesKey, options?.types]);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (\n\t\t\t\tlistenerIdRef.current &&\n\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t) {\n\t\t\t\t(repository as any).offDataChanged(listenerIdRef.current);\n\t\t\t\tlistenerIdRef.current = null;\n\t\t\t}\n\n\t\t\tlistenerIdRef.current = (repository as any).onDataChanged(\n\t\t\t\tcallbackRef.current as any,\n\t\t\t\t{\n\t\t\t\t\ttypes: stableTypes,\n\t\t\t\t}\n\t\t\t);\n\t\t\treturn () => {\n\t\t\t\tif (\n\t\t\t\t\tlistenerIdRef.current &&\n\t\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t\t) {\n\t\t\t\t\t(repository as any).offDataChanged(listenerIdRef.current);\n\t\t\t\t\tlistenerIdRef.current = null;\n\t\t\t\t}\n\t\t\t};\n\t\t}, [repository, stableTypes]);\n\t\t// ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΡΡΠ½ΠΎΠΉ ΠΎΡΠΏΠΈΡΠΊΠΈ\n\t\treturn () => {\n\t\t\tif (\n\t\t\t\tlistenerIdRef.current &&\n\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t) {\n\t\t\t\t(repository as any).offDataChanged(listenerIdRef.current);\n\t\t\t\tlistenerIdRef.current = null;\n\t\t\t}\n\t\t};\n\t}\n\t(hooks as any).useDataListener = useDataListener;\n\n\ttypeKeys.forEach((typeName) => {\n\t\tconst relatedHookName = `use${toPascalCase(\n\t\t\tString(typeName)\n\t\t)}Related` as keyof RpcHooks<TTypes>;\n\n\t\tfunction useRelatedHook<TTarget extends keyof TTypes>(\n\t\t\tid: string | number,\n\t\t\ttargetType: TTarget\n\t\t) {\n\t\t\tconst { repository } = useRpc<TTypes>();\n\t\t\tconst sourceData = useSelector(\n\t\t\t\t(state: RpcState<TTypes>) =>\n\t\t\t\t\t(state.rpc[typeName] as unknown) ?? EMPTY_MAP\n\t\t\t);\n\t\t\tconst targetData = useSelector(\n\t\t\t\t(state: RpcState<TTypes>) =>\n\t\t\t\t\t(state.rpc[targetType] as unknown) ?? EMPTY_MAP\n\t\t\t);\n\n\t\t\t// ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ Π²Π΅ΡΡΠΈΡ Π΄Π»Ρ ΠΈΠ½Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΊΡΡΠ°\n\t\t\tconst dataVersion = React.useMemo(() => {\n\t\t\t\tconst sourceKeys = Object.keys(sourceData as any).length;\n\t\t\t\tconst targetKeys = Object.keys(targetData as any).length;\n\t\t\t\treturn `${sourceKeys}:${targetKeys}`;\n\t\t\t}, [sourceData, targetData]);\n\n\t\t\tconst relatedData = React.useMemo(() => {\n\t\t\t\t// ΠΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΡΡΠ΅Ρ ΠΊ dataVersion\n\t\t\t\tvoid dataVersion;\n\t\t\t\ttry {\n\t\t\t\t\treturn (repository as any).getRelated(\n\t\t\t\t\t\ttypeName,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttargetType\n\t\t\t\t\t) as Array<\n\t\t\t\t\t\tTTypes[TTarget] extends Rpc<infer S>\n\t\t\t\t\t\t\t? z.infer<S>\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t>;\n\t\t\t\t} catch {\n\t\t\t\t\treturn [] as Array<\n\t\t\t\t\t\tTTypes[TTarget] extends Rpc<infer S>\n\t\t\t\t\t\t\t? z.infer<S>\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t>;\n\t\t\t\t}\n\t\t\t}, [repository, id, targetType, dataVersion]);\n\n\t\t\treturn relatedData;\n\t\t}\n\t\t(hooks as any)[relatedHookName] = useRelatedHook;\n\t});\n\n\t// Π₯ΡΠΊ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠ»Π½ΠΎΠΉ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠ΅ΠΉ\n\tfunction useHandleMessages() {\n\t\tconst { repository } = useRpc<TTypes>();\n\n\t\tconst handleMessages = (\n\t\t\tmessages: Array<Message<TTypes>>,\n\t\t\tcallbacks?: {\n\t\t\t\t[K in keyof TTypes]?: (\n\t\t\t\t\tdata:\n\t\t\t\t\t\t| InferRpcType<TTypes[K]>[]\n\t\t\t\t\t\t| Record<\n\t\t\t\t\t\t string,\n\t\t\t\t\t\t Partial<InferRpcType<TTypes[K]>> | null\n\t\t\t\t\t\t >\n\t\t\t\t) => void;\n\t\t\t}\n\t\t) => {\n\t\t\trepository.handleMessages(messages, callbacks);\n\t\t};\n\n\t\tconst handleMessagesTyped = <\n\t\t\tRpcStorageType extends Record<keyof TTypes, StorageType>\n\t\t>(\n\t\t\tmessages: Array<Message<TTypes>>,\n\t\t\tcallbacks?: {\n\t\t\t\t[K in keyof TTypes]?: (\n\t\t\t\t\tdata: RpcStorageType[K] extends \"collection\"\n\t\t\t\t\t\t?\n\t\t\t\t\t\t | Record<\n\t\t\t\t\t\t string,\n\t\t\t\t\t\t Partial<InferRpcType<TTypes[K]>> | null\n\t\t\t\t\t\t >\n\t\t\t\t\t\t | Array<InferRpcType<TTypes[K]>>\n\t\t\t\t\t\t: RpcStorageType[K] extends \"singleton\"\n\t\t\t\t\t\t? Partial<InferRpcType<TTypes[K]>>\n\t\t\t\t\t\t: never\n\t\t\t\t) => void;\n\t\t\t}\n\t\t) => {\n\t\t\trepository.handleMessages<RpcStorageType>(messages, callbacks);\n\t\t};\n\n\t\treturn { handleMessages, handleMessagesTyped };\n\t}\n\n\t(hooks as any).useHandleMessages = useHandleMessages;\n\n\treturn hooks;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useMemo } from \"react\";\nimport { Message, Rpc, RpcRepository, StorageType } from \"@yunu-lab/rpc-ts\";\nimport { z } from \"zod\";\n\ntype InferRpcType<T> = T extends Rpc<infer S> ? z.infer<S> : never;\n\ntype ToPascalCase<S extends string> = S extends `${infer First}_${infer Rest}`\n ? `${Capitalize<First>}${ToPascalCase<Rest>}`\n : Capitalize<S>;\n\ntype InlineRpcHooks<\n TTypes extends Record<string, Rpc<any>>,\n RpcStorageType extends Record<keyof TTypes, StorageType>\n> = {\n [K in keyof TTypes as `use${ToPascalCase<string & K>}`]: {\n (): {\n [P in K as `${P & string}s`]: RpcStorageType[P] extends \"collection\"\n ? InferRpcType<TTypes[P]>[]\n : RpcStorageType[P] extends \"singleton\"\n ? InferRpcType<TTypes[P]> | null\n : InferRpcType<TTypes[P]>[];\n } & {\n [P in K as `${P &\n string}Map`]: RpcStorageType[P] extends \"collection\"\n ? Record<string, InferRpcType<TTypes[P]>>\n : RpcStorageType[P] extends \"singleton\"\n ? InferRpcType<TTypes[P]> | null\n : Record<string, InferRpcType<TTypes[P]>>;\n } & {\n findById: (id: string | number) => InferRpcType<TTypes[K]> | null;\n findAll: () => InferRpcType<TTypes[K]>[];\n mergeRpc: {\n (\n data:\n | Record<\n string,\n Partial<InferRpcType<TTypes[K]>> | null\n >\n | InferRpcType<TTypes[K]>[]\n | Partial<InferRpcType<TTypes[K]>>\n ): InferRpcType<TTypes[K]>[];\n <Rst extends Record<keyof TTypes, StorageType>>(\n data: Rst[K] extends \"collection\"\n ?\n | Record<\n string,\n Partial<InferRpcType<TTypes[K]>> | null\n >\n | InferRpcType<TTypes[K]>[]\n : Rst[K] extends \"singleton\"\n ? Partial<InferRpcType<TTypes[K]>>\n : never\n ): Rst[K] extends \"collection\"\n ? InferRpcType<TTypes[K]>[]\n : Rst[K] extends \"singleton\"\n ? InferRpcType<TTypes[K]>\n : never;\n };\n clear: () => void;\n };\n (id: string | number): InferRpcType<TTypes[K]> | null;\n };\n} & {\n // ΠΠ΅Ρ-ΡΠΈΠΏΠΎΠ²ΡΠ΅ ΡΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ\n [K in keyof TTypes as `use${ToPascalCase<string & K>}Listener`]: <\n RpcStorageTypeMap extends Record<\n keyof TTypes,\n StorageType\n > = RpcStorageType\n >(\n callback: (event: {\n type: K;\n payload: RpcStorageTypeMap[K] extends \"collection\"\n ? Array<InferRpcType<TTypes[K]>>\n : RpcStorageTypeMap[K] extends \"singleton\"\n ? InferRpcType<TTypes[K]>\n : Array<InferRpcType<TTypes[K]>>;\n }) => void\n ) => () => void;\n} & {\n // ΠΠ±ΡΠΈΠΉ ΡΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΠΏΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΡΠΈΠΏΠ°ΠΌ\n useDataListener: <\n RpcStorageTypeMap extends Record<\n keyof TTypes,\n StorageType\n > = RpcStorageType\n >(\n callback: (\n events: Array<{\n type: keyof TTypes;\n payload: RpcStorageTypeMap[keyof TTypes] extends \"collection\"\n ? Array<InferRpcType<TTypes[keyof TTypes]>>\n : RpcStorageTypeMap[keyof TTypes] extends \"singleton\"\n ? InferRpcType<TTypes[keyof TTypes]>\n : Array<InferRpcType<TTypes[keyof TTypes]>>;\n }>\n ) => void,\n options?: { types?: (keyof TTypes)[] }\n ) => () => void;\n} & {\n useHandleMessages: () => {\n handleMessages<\n RpcStorageType extends Record<keyof TTypes, StorageType>\n >(\n messages: Array<Message<TTypes>>,\n callbacks?: {\n [K in keyof TTypes]?: (\n data: RpcStorageType[K] extends \"collection\"\n ?\n | Record<\n string,\n Partial<InferRpcType<TTypes[K]>> | null\n >\n | Array<InferRpcType<TTypes[K]>>\n : RpcStorageType[K] extends \"singleton\"\n ? Partial<InferRpcType<TTypes[K]>>\n : never\n ) => void;\n }\n ): void;\n };\n};\n\nexport type InlineRpcsConfig<\n TTypes extends Record<string, Rpc<any>>,\n RpcStorageType extends Record<keyof TTypes, StorageType>\n> = {\n [K in keyof TTypes]: {\n rpc: TTypes[K];\n storageType: RpcStorageType[K];\n idField?: string;\n };\n};\n\ntype RpcState<TTypes extends Record<string, Rpc<any>>> = {\n [K in keyof TTypes]?: any;\n};\n\nexport function useInlineRpcStore<\n TTypes extends Record<string, Rpc<any>>,\n RpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n keyof TTypes,\n StorageType\n >\n>(rpcs: InlineRpcsConfig<TTypes, RpcStorageType>) {\n const typeNames = React.useMemo(\n () => Object.keys(rpcs) as Array<keyof TTypes>,\n [rpcs]\n );\n\n const typeNamesKey = React.useMemo(\n () => Object.keys(rpcs).map(String).sort().join(\"|\"),\n [rpcs]\n );\n\n const repository = React.useMemo(() => {\n const repo = new RpcRepository<TTypes>();\n typeNames.forEach((key) => {\n const { rpc, storageType } = rpcs[key];\n repo.registerRpc(String(key), rpc, { storageType });\n });\n return repo;\n }, [typeNamesKey]);\n\n const [rpcState, setRpcState] = React.useState<RpcState<TTypes>>({});\n\n React.useEffect(() => {\n const unsubscribe = repository.onDataChanged(\n (events: Array<{ type: keyof TTypes; payload: any }>) => {\n console.log(events);\n\n setRpcState((prev) => {\n const next: RpcState<TTypes> = { ...prev };\n for (const event of events) {\n const type = event.type as keyof TTypes;\n const storageType =\n (rpcs as any)[type]?.storageType ??\n (repository as any).getStorageType?.(String(type));\n if (storageType === \"singleton\") {\n next[type] = Array.isArray(event.payload)\n ? event.payload[0] ?? null\n : event.payload ?? null;\n } else {\n // Store arrays for collections\n const nextArray = Array.isArray(event.payload)\n ? event.payload\n : Object.values(event.payload || {});\n next[type] = nextArray;\n }\n }\n return next;\n });\n },\n {\n types: typeNames as readonly (keyof TTypes)[],\n }\n );\n return () => {\n repository.offDataChanged(unsubscribe);\n };\n }, [repository, typeNamesKey]);\n\n const useInlineSelector = React.useCallback(\n <TSelected>(\n selector: (state: RpcState<TTypes>) => TSelected\n ): TSelected => {\n return selector(rpcState);\n },\n [rpcState]\n );\n\n const hooks = React.useMemo<InlineRpcHooks<TTypes, RpcStorageType>>(() => {\n const toPascalCase = (s: string): string =>\n s\n .split(\"_\")\n .map(\n (word) =>\n word.charAt(0).toUpperCase() +\n word.slice(1).toLowerCase()\n )\n .join(\"\");\n\n const result: Record<string, any> = {};\n\n (Object.keys(rpcs) as Array<keyof TTypes>).forEach((typeName) => {\n const storageType = rpcs[typeName].storageType as StorageType;\n const hookName = `use${toPascalCase(String(typeName))}`;\n\n function useTypeHook(id?: string | number) {\n const allData = useInlineSelector((state) => state[typeName]);\n\n const findById = React.useCallback(\n (itemId: string | number) =>\n (repository as any).findById(typeName, itemId),\n []\n );\n const findAll = React.useCallback(\n () => (repository as any).findAll(typeName),\n []\n );\n const mergeRpc = React.useCallback(\n (\n data:\n | Record<\n string,\n Partial<\n InferRpcType<TTypes[typeof typeName]>\n > | null\n >\n | Array<InferRpcType<TTypes[typeof typeName]>>\n | Partial<InferRpcType<TTypes[typeof typeName]>>\n ) => {\n // ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ UI β onDataChanged\n repository.mergeRpc(typeName, data);\n },\n []\n );\n const clear = React.useCallback(() => {\n if (storageType === \"singleton\") {\n // Π‘ΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅\n setRpcState((prev) => ({ ...prev, [typeName]: null }));\n } else {\n const ids: Array<string | number> = Array.isArray(\n allData\n )\n ? ((allData as Array<any>)\n .map((item) =>\n item ? (item as any).id : undefined\n )\n .filter((v) => v !== undefined) as Array<\n string | number\n >)\n : Object.keys((allData as any) || {});\n const deletePayload: Record<string | number, null> = {};\n for (const id of ids) deletePayload[id] = null;\n if (Object.keys(deletePayload).length > 0) {\n repository.mergeRpc(typeName, deletePayload);\n }\n setRpcState((prev) => ({ ...prev, [typeName]: [] }));\n }\n }, [allData]);\n\n const list = useMemo(\n () =>\n (Array.isArray(allData)\n ? allData\n : Object.values(allData || {})) as Array<\n InferRpcType<TTypes[typeof typeName]>\n >,\n [allData]\n );\n const collectionMap = useMemo(() => {\n const rec: Record<\n string | number,\n InferRpcType<TTypes[typeof typeName]>\n > = {} as any;\n\n if (Array.isArray(list)) {\n for (const item of list as Array<any>) {\n if (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n \"id\" in (item as Record<string, unknown>)\n ) {\n rec[(item as any).id as any] = item as any;\n }\n }\n }\n return rec;\n }, [list]);\n\n if (id !== undefined) {\n return findById(id);\n }\n\n if (storageType === \"singleton\") {\n const current =\n (allData as InferRpcType<TTypes[typeof typeName]>) ||\n null;\n return {\n [`${String(typeName)}s`]: current,\n [`${String(typeName)}Map`]: current,\n findById,\n findAll,\n mergeRpc,\n clear,\n } as any;\n }\n\n return {\n [`${String(typeName)}s`]: list,\n [`${String(typeName)}Map`]: collectionMap,\n findById,\n findAll,\n mergeRpc,\n clear,\n } as any;\n }\n\n (result as any)[hookName] = useTypeHook;\n\n // Π’ΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΡΠΎΠ±ΡΡΠΈΠΉ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°\n const listenerHookName = `use${toPascalCase(\n String(typeName)\n )}Listener`;\n\n function useListenerHook<\n RpcStorageTypeMap extends Record<\n keyof TTypes,\n StorageType\n > = RpcStorageType\n >(\n callback: (event: {\n type: typeof typeName;\n payload: RpcStorageTypeMap[typeof typeName] extends \"collection\"\n ? Array<InferRpcType<TTypes[typeof typeName]>>\n : RpcStorageTypeMap[typeof typeName] extends \"singleton\"\n ? InferRpcType<TTypes[typeof typeName]>\n : Array<InferRpcType<TTypes[typeof typeName]>>;\n }) => void\n ) {\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n\n React.useEffect(() => {\n const unsub = repository.onDataChanged(\n (\n events: Array<{\n type: keyof TTypes;\n payload: any;\n }>\n ) => {\n const filtered = events.filter(\n (e) => e.type === typeName\n );\n if (filtered.length === 0) return;\n const event = filtered[0];\n const storageType = repository.getStorageType(\n String(typeName)\n );\n if (\n storageType === \"singleton\" &&\n Array.isArray(event.payload)\n ) {\n const payload = event.payload[0] ?? null;\n // Π΄Π»Ρ singleton ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ\n if (payload) {\n callbackRef.current({\n type: typeName,\n payload,\n } as any);\n }\n } else {\n callbackRef.current(event as any);\n }\n },\n { types: [typeName] as any }\n );\n return () => {\n repository.offDataChanged(unsub);\n };\n }, []);\n return () => {};\n }\n\n (result as any)[listenerHookName] = useListenerHook;\n });\n\n // ΠΠ±ΡΠΈΠΉ ΡΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π΄Π°Π½Π½ΡΡ
ΠΏΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΡΠΈΠΏΠ°ΠΌ\n function useDataListener<\n RpcStorageTypeMap extends Record<\n keyof TTypes,\n StorageType\n > = RpcStorageType\n >(\n callback: (\n events: Array<{\n type: keyof TTypes;\n payload: RpcStorageTypeMap[keyof TTypes] extends \"collection\"\n ? Array<InferRpcType<TTypes[keyof TTypes]>>\n : RpcStorageTypeMap[keyof TTypes] extends \"singleton\"\n ? InferRpcType<TTypes[keyof TTypes]>\n : Array<InferRpcType<TTypes[keyof TTypes]>>;\n }>\n ) => void,\n options?: { types?: (keyof TTypes)[] }\n ) {\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n\n const types = options?.types ?? (typeNames as (keyof TTypes)[]);\n const typesKey = React.useMemo(\n () => [...types].map(String).sort().join(\"|\"),\n [types]\n );\n\n React.useEffect(() => {\n const unsub = repository.onDataChanged(\n (events: any) => callbackRef.current(events),\n { types: types as any }\n );\n return () => {\n repository.offDataChanged(unsub);\n };\n }, [typesKey, types]);\n return () => {};\n }\n\n (result as any).useDataListener = useDataListener;\n\n function useHandleMessages() {\n const handleMessages = (\n messages: Array<Message<TTypes>>,\n callbacks?: {\n [K in keyof TTypes]?: (\n data:\n | InferRpcType<TTypes[K]>[]\n | Record<\n string,\n Partial<InferRpcType<TTypes[K]>> | null\n >\n ) => void;\n }\n ) => {\n repository.handleMessages(messages, callbacks);\n };\n\n const handleMessagesTyped = <\n RpcStorageTypeMap extends Record<keyof TTypes, StorageType>\n >(\n messages: Array<Message<TTypes>>,\n callbacks?: {\n [K in keyof TTypes]?: (\n data: RpcStorageTypeMap[K] extends \"collection\"\n ?\n | Record<\n string,\n Partial<InferRpcType<TTypes[K]>> | null\n >\n | Array<InferRpcType<TTypes[K]>>\n : RpcStorageTypeMap[K] extends \"singleton\"\n ? Partial<InferRpcType<TTypes[K]>>\n : never\n ) => void;\n }\n ) => {\n repository.handleMessages<RpcStorageTypeMap>(\n messages,\n callbacks\n );\n };\n\n return { handleMessages, handleMessagesTyped };\n }\n\n (result as any).useHandleMessages = useHandleMessages;\n\n return result as InlineRpcHooks<TTypes, RpcStorageType>;\n }, [rpcs, repository, useInlineSelector, typeNames]);\n\n return { hooks, repository } as const;\n}\n"],"names":["id","toPascalCase","storageType"],"mappings":";;;;;;AAeO,MAAM,cAAc,CAAC,YAAgC;AACxD,QAAM,EAAE,YAAY,OAAO,SAAS,CAAA,MAAO;AAE3C,QAAM,WAAW,YAAY;AAAA,IACzB,MAAM;AAAA,IACN,cAAc,CAAA;AAAA,IACd,UAAU;AAAA,MACN,SAAS,CACL,OACA,WAIC;AACD,cAAM,EAAE,MAAM,KAAA,IAAS,OAAO;AAC9B,cAAM,IAAI,IAAI;AAAA,MAClB;AAAA,IAAA;AAAA,EACJ,CACH;AAED,QAAM,aAAa,gBAAgB;AAAA,IAC/B,GAAG;AAAA,IACH,KAAK,SAAS;AAAA,EAAA,CACjB;AAED,QAAM,eAAe,UAAU;AAE/B,QAAM,cAAc,WAAW,cAAc,CAAC,WAAW;AACrD,WAAO,QAAQ,CAAC,UAAU;AACtB,YAAM,EAAE,MAAM,QAAA,IAAY;AAE1B,YAAM,cAAc,WAAW,eAAe,OAAO,IAAI,CAAC;AAE1D,UAAI,gBAAgB,aAAa;AAC7B,cAAM,YAAY,MAAM,QAAQ,OAAO,IACjC,QAAQ,CAAC,KAAK,OACd,WAAW;AACjB,cAAM;AAAA,UACF,SAAS,QAAQ,QAAQ;AAAA,YACrB,MAAM,OAAO,IAAI;AAAA,YACjB,MAAM;AAAA,UAAA,CACT;AAAA,QAAA;AAAA,MAET,OAAO;AACH,cAAM,YAAY,MAAM,QAAQ,OAAO,IACjC,UACA,OAAO,OAAO,WAAW,EAAE;AACjC,cAAM;AAAA,UACF,SAAS,QAAQ,QAAQ;AAAA,YACrB,MAAM,OAAO,IAAI;AAAA,YACjB,MAAM;AAAA,UAAA,CACT;AAAA,QAAA;AAAA,MAET;AAAA,IACJ,CAAC;AAAA,EACL,CAAC;AAED,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;ACzEA,MAAM,aAAa,cAET,IAAI;AAOP,MAAM,cAA0C,CAAC;AAAA,EACpD;AAAA,EACA;AACJ,MAAM;AACF,SACI,oBAAC,WAAW,UAAX,EAAoB,OAAO,EAAE,WAAA,GACzB,UACL;AAER;ACbO,MAAM,SAAS,MAES;AAC3B,QAAM,UAAU,WAAW,UAAU;AAErC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC/D;AAEA,QAAM,aAAa,MAAM;AAAA,IACrB,MAAM,QAAQ;AAAA,IACd,CAAC,QAAQ,UAAU;AAAA,EAAA;AAGvB,SAAO;AAAA,IACH;AAAA,EAAA;AAER;ACjBA,MAAM,eAAe,CAAC,MAAsB;AAC3C,SAAO,EACL,MAAM,GAAG,EACT;AAAA,IACA,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAA,IAAgB,KAAK,MAAM,CAAC,EAAE,YAAA;AAAA,EAAY,EAEnE,KAAK,EAAE;AACV;AA6IO,MAAM,iBAAiB,CAO7B,aACsC;AACtC,QAAM,YAAqC,OAAO,OAAO,EAAE;AAE3D,QAAM,QAAQ,CAAA;AAGd,WAAS,QAAQ,CAAC,aAAa;AAC9B,UAAM,WAAW,MAAM;AAAA,MACtB,OAAO,QAAQ;AAAA,IAAA,CACf;AACD,UAAM,UAAU;AAEhB,aAAS,QAAQ,IAAsB;AACtC,YAAM,EAAE,WAAA,IAAe,OAAA;AACvB,YAAM,UAAU;AAAA,QACf,CAAC,UAA6B,MAAM,IAAI,OAAO,KAAiB;AAAA,MAAA;AAGjE,YAAM,cAAe,WAAmB;AAAA,QACvC,OAAO,OAAO;AAAA,MAAA;AAGf,YAAM,OAAO,MAAM,QAAQ,MAAM;AAChC,YAAI,gBAAgB,YAAa,QAAO,CAAA;AAGxC,YAAI,MAAM,QAAQ,OAAO,GAAG;AAC3B,iBAAO;AAAA,QACR;AACA,eAAO,OAAO,OAAO,WAAW,EAAE;AAAA,MAGnC,GAAG,CAAC,SAAS,WAAW,CAAC;AAEzB,YAAM,WAAW,MAAM;AAAA,QACtB,CAACA,QAAwB,WAAW,SAAS,SAASA,GAAE;AAAA,QACxD,CAAC,UAAU;AAAA,MAAA;AAEZ,YAAM,UAAU,MAAM;AAAA,QACrB,MAAM,WAAW,QAAQ,OAAO;AAAA,QAChC,CAAC,UAAU;AAAA,MAAA;AAEZ,YAAM,WAAW,MAAM;AAAA,QACtB,CACC,SASI;AACJ,qBAAW,SAAS,SAAS,IAAI;AAAA,QAClC;AAAA,QACA,CAAC,UAAU;AAAA,MAAA;AAGZ,YAAM,QAAQ,MAAM,YAAY,MAAM;AACrC,mBAAW,MAAM,OAAO;AAAA,MACzB,GAAG,CAAC,UAAU,CAAC;AAEf,YAAM,aACL,gBAAgB,cACX,WAAW,OAGb;AAEJ,YAAM,YAAY,MAAM,QAAQ,MAAM;AACrC,YAAI,gBAAgB,aAAa;AAChC,iBAAQ,WAAW;AAAA,QAGpB;AACA,cAAM,SAA+D,CAAA;AACrE,mBAAW,QAAQ,MAAoB;AACtC,cAAI,QAAS,QAAQ,MAAO;AAC3B,mBAAO,OAAQ,KAAa,EAAE,CAAC,IAAI;AAAA,UACpC;AAAA,QACD;AACA,eAAO;AAAA,MACR,GAAG,CAAC,SAAS,MAAM,WAAW,CAAC;AAE/B,UAAI,OAAO,QAAW;AACrB,eAAO,SAAS,EAAE;AAAA,MACnB;AAEA,aAAO;AAAA,QACN,CAAC,GAAG,OAAO,OAAO,CAAC,GAAG,GAAG;AAAA,QACzB,CAAC,GAAG,OAAO,OAAO,CAAC,KAAK,GAAG;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEF;AAEC,UAAc,QAAQ,IAAI;AAE3B,UAAM,sBAAsB,MAAM;AAAA,MACjC,OAAO,QAAQ;AAAA,IAAA,CACf;AAED,aAAS,mBAEP,IAAsB;AACvB,YAAM,EAAE,WAAA,IAAe,OAAA;AACvB,YAAM,aAAa;AAAA,QAClB,CAAC,UAA4B,MAAM;AAAA,MAAA;AAGpC,YAAM,aAAa,MAAM,QAAQ,MAAM;AACtC,eAAO,OAAO,KAAK,UAAU,EAAE;AAAA,MAChC,GAAG,CAAC,UAAU,CAAC;AAEf,YAAM,WAAW,MAAM,QAAQ,MAAM;AAEpC,YAAI;AACH,iBAAQ,WAAmB;AAAA,YAC1B;AAAA,YACA;AAAA,UAAA;AAAA,QAEF,QAAQ;AACP,iBAAO;AAAA,QACR;AAAA,MACD,GAAG,CAAC,YAAY,IAAI,UAAU,CAAC;AAE/B,aAAO;AAAA,IACR;AACC,UAAc,mBAAmB,IAAI;AAAA,EACvC,CAAC;AAED,WAAS,QAAQ,CAAC,aAAa;AAC9B,UAAM,mBAAmB,MAAM;AAAA,MAC9B,OAAO,QAAQ;AAAA,IAAA,CACf;AAED,aAAS,gBAMR,UAQC;AACD,YAAM,EAAE,WAAA,IAAe,OAAA;AACvB,YAAM,cAAc,MAAM,OAAO,QAAQ;AACzC,YAAM,gBAAgB,MAAM,OAA+B,IAAI;AAC/D,kBAAY,UAAU;AAGtB,YAAM,cAAc,MAAM,QAAQ,MAAM;AACvC,eAAQ,WAAmB,iBAAiB,OAAO,QAAQ,CAAC;AAAA,MAC7D,GAAG,CAAC,UAAU,CAAC;AAEf,YAAM,SAAS,MAAM;AAAA,QACpB,CACC,WAII;AACJ,cAAI,CAAC,UAAU,OAAO,WAAW,EAAG;AACpC,gBAAM,QAAQ,OAAO,CAAC;AAEtB,cACC,gBAAgB,eAChB,MAAM,QAAQ,MAAM,OAAO,KAC3B,MAAM,QAAQ,SAAS,GACtB;AACD,kBAAM,iBAAiB;AAAA,cACtB,GAAG;AAAA,cACH,SAAS,MAAM,QAAQ,CAAC;AAAA,YAAA;AAEzB,wBAAY,QAAQ,cAAqB;AAAA,UAC1C,OAAO;AACN,wBAAY,QAAQ,KAAY;AAAA,UACjC;AAAA,QACD;AAAA,QACA,CAAC,WAAW;AAAA,MAAA;AAGb,YAAM,UAAU,MAAM;AACrB,YACC,cAAc,WACd,OAAQ,WAAmB,mBAAmB,YAC7C;AACA,qBAAmB,eAAe,cAAc,OAAO;AACxD,wBAAc,UAAU;AAAA,QACzB;AAEA,sBAAc,UAAW,WAAmB;AAAA,UAC3C;AAAA,UACA;AAAA,YACC,OAAO,CAAC,QAAQ;AAAA,UAAA;AAAA,QACjB;AAGD,eAAO,MAAM;AACZ,cACC,cAAc,WACd,OAAQ,WAAmB,mBAAmB,YAC7C;AACA,uBAAmB;AAAA,cACnB,cAAc;AAAA,YAAA;AAEf,0BAAc,UAAU;AAAA,UACzB;AAAA,QACD;AAAA,MACD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,aAAO,MAAM;AACZ,YACC,cAAc,WACd,OAAQ,WAAmB,mBAAmB,YAC7C;AACA,qBAAmB,eAAe,cAAc,OAAO;AACxD,wBAAc,UAAU;AAAA,QACzB;AAAA,MACD;AAAA,IACD;AACC,UAAc,gBAAgB,IAAI;AAAA,EACpC,CAAC;AAED,WAAS,gBAMR,UAUA,SACC;AACD,UAAM,EAAE,WAAA,IAAe,OAAA;AACvB,UAAM,cAAc,MAAM,OAAO,QAAQ;AACzC,UAAM,gBAAgB,MAAM,OAA+B,IAAI;AAC/D,gBAAY,UAAU;AAEtB,UAAM,QAAS,SAAS,SAAS;AAGjC,UAAM,WAAW,MAAM,QAAQ,MAAM;AACpC,YAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAA;AAC1B,aAAO,OAAO,KAAK,GAAG;AAAA,IACvB,GAAG,CAAC,KAAK,CAAC;AAEV,UAAM,cAAc,MAAM,QAAQ,MAAM;AAGvC,aAAO,SAAS,SAAS;AAAA,IAC1B,GAAG,CAAC,UAAU,SAAS,KAAK,CAAC;AAE7B,UAAM,UAAU,MAAM;AACrB,UACC,cAAc,WACd,OAAQ,WAAmB,mBAAmB,YAC7C;AACA,mBAAmB,eAAe,cAAc,OAAO;AACxD,sBAAc,UAAU;AAAA,MACzB;AAEA,oBAAc,UAAW,WAAmB;AAAA,QAC3C,YAAY;AAAA,QACZ;AAAA,UACC,OAAO;AAAA,QAAA;AAAA,MACR;AAED,aAAO,MAAM;AACZ,YACC,cAAc,WACd,OAAQ,WAAmB,mBAAmB,YAC7C;AACA,qBAAmB,eAAe,cAAc,OAAO;AACxD,wBAAc,UAAU;AAAA,QACzB;AAAA,MACD;AAAA,IACD,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,WAAO,MAAM;AACZ,UACC,cAAc,WACd,OAAQ,WAAmB,mBAAmB,YAC7C;AACA,mBAAmB,eAAe,cAAc,OAAO;AACxD,sBAAc,UAAU;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AACC,QAAc,kBAAkB;AAEjC,WAAS,QAAQ,CAAC,aAAa;AAC9B,UAAM,kBAAkB,MAAM;AAAA,MAC7B,OAAO,QAAQ;AAAA,IAAA,CACf;AAED,aAAS,eACR,IACA,YACC;AACD,YAAM,EAAE,WAAA,IAAe,OAAA;AACvB,YAAM,aAAa;AAAA,QAClB,CAAC,UACC,MAAM,IAAI,QAAQ,KAAiB;AAAA,MAAA;AAEtC,YAAM,aAAa;AAAA,QAClB,CAAC,UACC,MAAM,IAAI,UAAU,KAAiB;AAAA,MAAA;AAIxC,YAAM,cAAc,MAAM,QAAQ,MAAM;AACvC,cAAM,aAAa,OAAO,KAAK,UAAiB,EAAE;AAClD,cAAM,aAAa,OAAO,KAAK,UAAiB,EAAE;AAClD,eAAO,GAAG,UAAU,IAAI,UAAU;AAAA,MACnC,GAAG,CAAC,YAAY,UAAU,CAAC;AAE3B,YAAM,cAAc,MAAM,QAAQ,MAAM;AAGvC,YAAI;AACH,iBAAQ,WAAmB;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAMF,QAAQ;AACP,iBAAO,CAAA;AAAA,QAKR;AAAA,MACD,GAAG,CAAC,YAAY,IAAI,YAAY,WAAW,CAAC;AAE5C,aAAO;AAAA,IACR;AACC,UAAc,eAAe,IAAI;AAAA,EACnC,CAAC;AAGD,WAAS,oBAAoB;AAC5B,UAAM,EAAE,WAAA,IAAe,OAAA;AAEvB,UAAM,iBAAiB,CACtB,UACA,cAUI;AACJ,iBAAW,eAAe,UAAU,SAAS;AAAA,IAC9C;AAEA,UAAM,sBAAsB,CAG3B,UACA,cAcI;AACJ,iBAAW,eAA+B,UAAU,SAAS;AAAA,IAC9D;AAEA,WAAO,EAAE,gBAAgB,oBAAA;AAAA,EAC1B;AAEC,QAAc,oBAAoB;AAEnC,SAAO;AACR;ACnbO,SAAS,kBAMd,MAAgD;AAC9C,QAAM,YAAY,MAAM;AAAA,IACpB,MAAM,OAAO,KAAK,IAAI;AAAA,IACtB,CAAC,IAAI;AAAA,EAAA;AAGT,QAAM,eAAe,MAAM;AAAA,IACvB,MAAM,OAAO,KAAK,IAAI,EAAE,IAAI,MAAM,EAAE,KAAA,EAAO,KAAK,GAAG;AAAA,IACnD,CAAC,IAAI;AAAA,EAAA;AAGT,QAAM,aAAa,MAAM,QAAQ,MAAM;AACnC,UAAM,OAAO,IAAI,cAAA;AACjB,cAAU,QAAQ,CAAC,QAAQ;AACvB,YAAM,EAAE,KAAK,gBAAgB,KAAK,GAAG;AACrC,WAAK,YAAY,OAAO,GAAG,GAAG,KAAK,EAAE,aAAa;AAAA,IACtD,CAAC;AACD,WAAO;AAAA,EACX,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAA2B,CAAA,CAAE;AAEnE,QAAM,UAAU,MAAM;AAClB,UAAM,cAAc,WAAW;AAAA,MAC3B,CAAC,WAAwD;AACrD,gBAAQ,IAAI,MAAM;AAElB,oBAAY,CAAC,SAAS;AAClB,gBAAM,OAAyB,EAAE,GAAG,KAAA;AACpC,qBAAW,SAAS,QAAQ;AACxB,kBAAM,OAAO,MAAM;AACnB,kBAAM,cACD,KAAa,IAAI,GAAG,eACpB,WAAmB,iBAAiB,OAAO,IAAI,CAAC;AACrD,gBAAI,gBAAgB,aAAa;AAC7B,mBAAK,IAAI,IAAI,MAAM,QAAQ,MAAM,OAAO,IAClC,MAAM,QAAQ,CAAC,KAAK,OACpB,MAAM,WAAW;AAAA,YAC3B,OAAO;AAEH,oBAAM,YAAY,MAAM,QAAQ,MAAM,OAAO,IACvC,MAAM,UACN,OAAO,OAAO,MAAM,WAAW,CAAA,CAAE;AACvC,mBAAK,IAAI,IAAI;AAAA,YACjB;AAAA,UACJ;AACA,iBAAO;AAAA,QACX,CAAC;AAAA,MACL;AAAA,MACA;AAAA,QACI,OAAO;AAAA,MAAA;AAAA,IACX;AAEJ,WAAO,MAAM;AACT,iBAAW,eAAe,WAAW;AAAA,IACzC;AAAA,EACJ,GAAG,CAAC,YAAY,YAAY,CAAC;AAE7B,QAAM,oBAAoB,MAAM;AAAA,IAC5B,CACI,aACY;AACZ,aAAO,SAAS,QAAQ;AAAA,IAC5B;AAAA,IACA,CAAC,QAAQ;AAAA,EAAA;AAGb,QAAM,QAAQ,MAAM,QAAgD,MAAM;AACtE,UAAMC,gBAAe,CAAC,MAClB,EACK,MAAM,GAAG,EACT;AAAA,MACG,CAAC,SACG,KAAK,OAAO,CAAC,EAAE,YAAA,IACf,KAAK,MAAM,CAAC,EAAE,YAAA;AAAA,IAAY,EAEjC,KAAK,EAAE;AAEhB,UAAM,SAA8B,CAAA;AAEnC,WAAO,KAAK,IAAI,EAA0B,QAAQ,CAAC,aAAa;AAC7D,YAAM,cAAc,KAA