/* eslint-disable @typescript-eslint/no-empty-object-type */ import 'miniprogram-api-typings' import { behavior } from './behavior' import { type StoreBindingsManager, createActions, createDataFieldsReactions } from './core' type Action = string export interface IStoreBindings> { namespace?: string store: T fields: (keyof T)[] | { [k: string]: keyof T | ((...args: any) => any) } actions: (keyof T)[] | { [k: Action]: keyof T } structuralComparison?: boolean } type StoreData> = T['fields'] extends string[] ? { [k in T['fields'][number]]: T['store'][k] } : T['fields'] extends { [k: Action]: string | ((...args: any) => any) } ? { [k in keyof T['fields']]: T['fields'][k] extends (...args: any) => any ? ReturnType : T['fields'][k] extends string ? T['store'][T['fields'][k]] : unknown } : unknown type StoreAction> = T['actions'] extends string[] ? { [k in T['actions'][number]]: T['store'][k] } : T['actions'] extends { [k: Action]: string } ? { [k in keyof T['actions']]: T['store'][T['actions'][k]] } : unknown type StoreOptions< TStoreBindings extends IStoreBindings, TData extends WechatMiniprogram.Component.DataOption, TProperty extends WechatMiniprogram.Component.PropertyOption, TMethod extends WechatMiniprogram.Component.MethodOption, TBehavior extends WechatMiniprogram.Component.BehaviorOption, TCustomInstanceProperty extends WechatMiniprogram.IAnyObject = object, > = (Partial> & Partial> & Partial> & Partial> & Partial & Partial & { storeBindings: TStoreBindings }) & ThisType< WechatMiniprogram.Component.Instance< TData & StoreData, TProperty, TMethod & StoreAction, TBehavior, TCustomInstanceProperty > > type StoreListOptions< TStoreBindings extends IStoreBindings[], TData extends WechatMiniprogram.Component.DataOption, TProperty extends WechatMiniprogram.Component.PropertyOption, TMethod extends WechatMiniprogram.Component.MethodOption, TBehavior extends WechatMiniprogram.Component.BehaviorOption, TCustomInstanceProperty extends WechatMiniprogram.IAnyObject = {}, > = (Partial> & Partial> & Partial> & Partial> & Partial & Partial & { storeBindings: TStoreBindings }) & ThisType< WechatMiniprogram.Component.Instance< TData & StoreData & StoreData & StoreData & StoreData & StoreData & StoreData & StoreData & StoreData, TProperty, TMethod & StoreAction & StoreAction & StoreAction & StoreAction & StoreAction & StoreAction & StoreAction & StoreAction, TBehavior, TCustomInstanceProperty > > export function ComponentWithStore< TStoreBindings extends IStoreBindings, TData extends WechatMiniprogram.Component.DataOption, TProperty extends WechatMiniprogram.Component.PropertyOption, TMethod extends WechatMiniprogram.Component.MethodOption, TBehavior extends WechatMiniprogram.Component.BehaviorOption, TCustomInstanceProperty extends WechatMiniprogram.IAnyObject = {}, >( options: StoreOptions< TStoreBindings, TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty >, ): WechatMiniprogram.Component.Instance< TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty > export function ComponentWithStore< TStoreBindings extends IStoreBindings[], TData extends WechatMiniprogram.Component.DataOption, TProperty extends WechatMiniprogram.Component.PropertyOption, TMethod extends WechatMiniprogram.Component.MethodOption, TBehavior extends WechatMiniprogram.Component.BehaviorOption, TCustomInstanceProperty extends WechatMiniprogram.IAnyObject = {}, >( options: StoreListOptions< TStoreBindings, TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty >, ): WechatMiniprogram.Component.Instance< TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty > export function ComponentWithStore< TStoreBindings extends IStoreBindings[], TData extends WechatMiniprogram.Component.DataOption, TProperty extends WechatMiniprogram.Component.PropertyOption, TMethod extends WechatMiniprogram.Component.MethodOption, TBehavior extends WechatMiniprogram.Component.BehaviorOption, TCustomInstanceProperty extends WechatMiniprogram.IAnyObject = {}, >( options: StoreListOptions< TStoreBindings, TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty >, ): WechatMiniprogram.Component.Instance< TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty > { if (!Array.isArray(options.behaviors)) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment options.behaviors = [] as any } // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access ;(options.behaviors as any).unshift(behavior) // eslint-disable-next-line @typescript-eslint/no-unsafe-return return Component(options) as any } export function BehaviorWithStore< TStoreBindings extends IStoreBindings, TData extends WechatMiniprogram.Component.DataOption, TProperty extends WechatMiniprogram.Component.PropertyOption, TMethod extends WechatMiniprogram.Component.MethodOption, TBehavior extends WechatMiniprogram.Component.BehaviorOption, TCustomInstanceProperty extends WechatMiniprogram.IAnyObject = {}, >( options: StoreOptions< TStoreBindings, TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty >, ): WechatMiniprogram.Behavior.Identifier export function BehaviorWithStore< TStoreBindings extends IStoreBindings[], TData extends WechatMiniprogram.Component.DataOption, TProperty extends WechatMiniprogram.Component.PropertyOption, TMethod extends WechatMiniprogram.Component.MethodOption, TBehavior extends WechatMiniprogram.Component.BehaviorOption, TCustomInstanceProperty extends WechatMiniprogram.IAnyObject = {}, >( options: StoreListOptions< TStoreBindings, TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty >, ): WechatMiniprogram.Behavior.Identifier export function BehaviorWithStore< TStoreBindings extends IStoreBindings[], TData extends WechatMiniprogram.Component.DataOption, TProperty extends WechatMiniprogram.Component.PropertyOption, TMethod extends WechatMiniprogram.Component.MethodOption, TBehavior extends WechatMiniprogram.Component.BehaviorOption, TCustomInstanceProperty extends WechatMiniprogram.IAnyObject = {}, >( options: StoreListOptions< TStoreBindings, TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty >, ): WechatMiniprogram.Behavior.Identifier { if (!Array.isArray(options.behaviors)) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment options.behaviors = [] as any } // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access ;(options.behaviors as any).unshift(behavior) return Behavior(options) } export const createStoreBindings = >( target: WechatMiniprogram.Component.Instance, options: IStoreBindings, ): StoreBindingsManager => { createActions(target, options) return createDataFieldsReactions(target, options) } export const storeBindingsBehavior = behavior export type InitializedStoreBindings = { updateStoreBindings: () => void } export const initStoreBindings = >( ctx: WechatMiniprogram.GlassEasel.TypeUtils.BuilderContext, options: Omit, 'actions'>, ): InitializedStoreBindings => { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const { self, lifetime } = ctx let storeBindings: StoreBindingsManager | undefined lifetime('attached', () => { storeBindings = createDataFieldsReactions(self, options) storeBindings.updateStoreBindings() }) lifetime('detached', () => { storeBindings!.destroyStoreBindings() }) return { updateStoreBindings: () => { if (storeBindings) { storeBindings.updateStoreBindings() } }, } }