Skip to content

Commit

Permalink
feat: support extraThisFieldsType(#70)
Browse files Browse the repository at this point in the history
  • Loading branch information
gaoachao committed May 21, 2024
1 parent f6ff0bc commit 896386d
Show file tree
Hide file tree
Showing 12 changed files with 283 additions and 52 deletions.
5 changes: 4 additions & 1 deletion glass-easel-miniprogram-adapter/src/behavior.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type * as glassEasel from 'glass-easel'
import { type GeneralComponentDefinition, type utils as typeUtils } from './types'
import { type GeneralComponent } from './component'

type Empty = typeUtils.Empty
type DataList = typeUtils.DataList
type PropertyList = typeUtils.PropertyList
type MethodList = typeUtils.MethodList
Expand All @@ -16,6 +17,7 @@ export type GeneralBehavior = Behavior<
Record<string, any>,
Record<string, any>,
Record<string, any>,
any,
any
>

Expand All @@ -25,6 +27,7 @@ export class Behavior<
TMethod extends MethodList,
TChainingFilter extends ChainingFilterType,
TComponentExport = never,
TDelayedData extends DataList = Empty,
> {
/** @internal */
_$: glassEasel.GeneralBehavior
Expand All @@ -35,7 +38,7 @@ export class Behavior<

/** @internal */
constructor(
inner: glassEasel.Behavior<TData, TProperty, TMethod, TChainingFilter>,
inner: glassEasel.Behavior<TData, TProperty, TMethod, TChainingFilter, TDelayedData>,
parents: GeneralBehavior[],
definitionFilter: DefinitionFilter | undefined,
componentExport: ((source: GeneralComponent | null) => TComponentExport) | undefined,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type TaggedMethod<Fn extends ComponentMethod> = typeUtils.TaggedMethod<Fn>
export class BaseBehaviorBuilder<
TPrevData extends DataList = Empty,
TData extends DataList = Empty,
TDelayedData extends DataList = Empty,
TProperty extends PropertyList = Empty,
TMethod extends MethodList = Empty,
TChainingFilter extends ChainingFilterType = never,
Expand All @@ -37,6 +38,7 @@ export class BaseBehaviorBuilder<
protected _$!: glassEasel.BehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty,
TMethod,
TChainingFilter,
Expand Down Expand Up @@ -67,6 +69,7 @@ export class BaseBehaviorBuilder<
BaseBehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty,
TMethod,
TChainingFilter,
Expand All @@ -86,6 +89,7 @@ export class BaseBehaviorBuilder<
BaseBehaviorBuilder<
T,
TData & T,
TDelayedData,
TProperty,
TMethod,
TChainingFilter,
Expand All @@ -105,6 +109,7 @@ export class BaseBehaviorBuilder<
BaseBehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty & Record<N, unknown extends V ? T : typeUtils.PropertyOption<T, V>>,
TMethod,
TChainingFilter,
Expand All @@ -123,11 +128,12 @@ export class BaseBehaviorBuilder<
* The public method can be used as an event handler, and can be visited in component instance.
*/
methods<T extends MethodList>(
funcs: T & ThisType<Component<TData, TProperty, TMethod & T, any>>,
funcs: T & ThisType<Component<TData, TProperty, TMethod & T, any, TDelayedData>>,
): ResolveBehaviorBuilder<
BaseBehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty,
TMethod & T,
TChainingFilter,
Expand All @@ -153,7 +159,7 @@ export class BaseBehaviorBuilder<
>,
>(
paths: P,
func: (this: Component<TData, TProperty, TMethod, any>, newValue: V) => void,
func: (this: Component<TData, TProperty, TMethod, any, TDelayedData>, newValue: V) => void,
once?: boolean,
): ResolveBehaviorBuilder<this, TChainingFilter>
observer<
Expand All @@ -169,14 +175,14 @@ export class BaseBehaviorBuilder<
>(
paths: readonly [...P],
func: (
this: Component<TData, TProperty, TMethod, any>,
this: Component<TData, TProperty, TMethod, any, TDelayedData>,
...newValues: V extends any[] ? V : never
) => void,
once?: boolean,
): ResolveBehaviorBuilder<this, TChainingFilter>
observer(
paths: string | readonly string[],
func: (this: Component<TData, TProperty, TMethod, any>, ...args: any[]) => any,
func: (this: Component<TData, TProperty, TMethod, any, TDelayedData>, ...args: any[]) => any,
once = false,
): ResolveBehaviorBuilder<this, TChainingFilter> {
this._$.observer(paths as any, func as any, once)
Expand All @@ -189,7 +195,7 @@ export class BaseBehaviorBuilder<
lifetime<L extends keyof Lifetimes>(
name: L,
func: (
this: Component<TData, TProperty, TMethod, any>,
this: Component<TData, TProperty, TMethod, any, TDelayedData>,
...args: Parameters<Lifetimes[L]>
) => ReturnType<Lifetimes[L]>,
once = false,
Expand All @@ -203,7 +209,7 @@ export class BaseBehaviorBuilder<
*/
pageLifetime(
name: string,
func: (this: Component<TData, TProperty, TMethod, any>, ...args: any[]) => any,
func: (this: Component<TData, TProperty, TMethod, any, TDelayedData>, ...args: any[]) => any,
once = false,
): ResolveBehaviorBuilder<this, TChainingFilter> {
this._$.pageLifetime(name, func as any, once)
Expand All @@ -215,7 +221,8 @@ export class BaseBehaviorBuilder<
*/
relation(
name: string,
rel: RelationParams & ThisType<Component<TData, TProperty, TMethod, TComponentExport>>,
rel: RelationParams &
ThisType<Component<TData, TProperty, TMethod, TComponentExport, TDelayedData>>,
): ResolveBehaviorBuilder<this, TChainingFilter> {
const target =
rel.target instanceof Behavior || rel.target instanceof ComponentType
Expand All @@ -234,18 +241,19 @@ export class BaseBehaviorBuilder<

init<TExport extends Record<string, TaggedMethod<(...args: any[]) => any>> | void>(
func: (
this: Component<TData, TProperty, TMethod, TComponentExport>,
this: Component<TData, TProperty, TMethod, TComponentExport, TDelayedData>,
builderContext: BuilderContext<
TPrevData,
TProperty,
Component<TData, TProperty, TMethod, TComponentExport>
Component<TData, TProperty, TMethod, TComponentExport, TDelayedData>
>,
) => TExport,
// eslint-disable-next-line function-paren-newline
): ResolveBehaviorBuilder<
BaseBehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty,
TMethod,
TChainingFilter,
Expand Down Expand Up @@ -294,7 +302,13 @@ export class BaseBehaviorBuilder<
implement(traitBehavior._$, impl)
}) as BuilderContext<TPrevData, TProperty, TMethod>['implement']

const methodCaller = this as unknown as Component<TData, TProperty, TMethod, TComponentExport>
const methodCaller = this as unknown as Component<
TData,
TProperty,
TMethod,
TComponentExport,
TDelayedData
>

return func.call(methodCaller, {
self: methodCaller,
Expand Down Expand Up @@ -331,13 +345,15 @@ export class BaseBehaviorBuilder<
TData & TNewData,
TProperty & TNewProperty,
TMethod & TNewMethod,
TNewComponentExport
TNewComponentExport,
TDelayedData
>
>,
): ResolveBehaviorBuilder<
BaseBehaviorBuilder<
TPrevData,
TData & TNewData,
TDelayedData,
TProperty & TNewProperty,
TMethod & TNewMethod,
TChainingFilter,
Expand Down
50 changes: 44 additions & 6 deletions glass-easel-miniprogram-adapter/src/builder/behavior_builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ type ChainingFilterFunc<
export class BehaviorBuilder<
TPrevData extends DataList = Empty,
TData extends DataList = Empty,
TDelayedData extends DataList = Empty,
TProperty extends PropertyList = Empty,
TMethod extends MethodList = Empty,
TChainingFilter extends ChainingFilterType = never,
Expand All @@ -33,6 +34,7 @@ export class BehaviorBuilder<
> extends BaseBehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty,
TMethod,
TChainingFilter,
Expand All @@ -59,6 +61,7 @@ export class BehaviorBuilder<
BehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty,
TMethod,
TChainingFilter,
Expand All @@ -80,12 +83,14 @@ export class BehaviorBuilder<
UProperty extends PropertyList,
UMethod extends MethodList,
UChainingFilter extends ChainingFilterType,
UDelayedData extends DataList,
>(
behavior: Behavior<UData, UProperty, UMethod, UChainingFilter>,
behavior: Behavior<UData, UProperty, UMethod, UChainingFilter, UDelayedData>,
): ResolveBehaviorBuilder<
BehaviorBuilder<
TPrevData,
TData & UData,
TDelayedData & UDelayedData,
TProperty & UProperty,
TMethod & UMethod,
UChainingFilter,
Expand All @@ -107,6 +112,7 @@ export class BehaviorBuilder<
BehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty,
TMethod,
TChainingFilter,
Expand All @@ -130,6 +136,7 @@ export class BehaviorBuilder<
BehaviorBuilder<
T,
TData & T,
TDelayedData,
TProperty,
TMethod,
TChainingFilter,
Expand All @@ -153,6 +160,7 @@ export class BehaviorBuilder<
BehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty & Record<N, unknown extends V ? T : typeUtils.PropertyOption<T, V>>,
TMethod,
TChainingFilter,
Expand All @@ -170,11 +178,12 @@ export class BehaviorBuilder<
* The public method can be used as an event handler, and can be visited in component instance.
*/
override methods<T extends MethodList>(
funcs: T & ThisType<Component<TData, TProperty, TMethod & T, any>>,
funcs: T & ThisType<Component<TData, TProperty, TMethod & T, any, TDelayedData>>,
): ResolveBehaviorBuilder<
BehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty,
TMethod & T,
TChainingFilter,
Expand All @@ -195,18 +204,19 @@ export class BehaviorBuilder<
*/
override init<TExport extends Record<string, TaggedMethod<(...args: any[]) => any>> | void>(
func: (
this: Component<TData, TProperty, TMethod, TComponentExport>,
this: Component<TData, TProperty, TMethod, TComponentExport, TDelayedData>,
builderContext: BuilderContext<
TPrevData,
TProperty,
Component<TData, TProperty, TMethod, TComponentExport>
Component<TData, TProperty, TMethod, TComponentExport, TDelayedData>
>,
) => TExport,
// eslint-disable-next-line function-paren-newline
): ResolveBehaviorBuilder<
BehaviorBuilder<
TPrevData,
TData,
TDelayedData,
TProperty,
TMethod,
TChainingFilter,
Expand All @@ -231,13 +241,15 @@ export class BehaviorBuilder<
TData & TNewData,
TProperty & TNewProperty,
TMethod & TNewMethod,
TNewComponentExport
TNewComponentExport,
TDelayedData
>
>,
): ResolveBehaviorBuilder<
BehaviorBuilder<
TPrevData,
TData & TNewData,
TDelayedData,
TProperty & TNewProperty,
TMethod & TNewMethod,
TChainingFilter,
Expand All @@ -254,12 +266,38 @@ export class BehaviorBuilder<
/**
* Finish the behavior definition process
*/
register(): Behavior<TData, TProperty, TMethod, TPendingChainingFilter, TComponentExport> {
register(): Behavior<
TData,
TProperty,
TMethod,
TPendingChainingFilter,
TComponentExport,
TDelayedData
> {
return new Behavior(
this._$.registerBehavior(),
this._$parents,
this._$definitionFilter,
this._$export,
)
}

/**
* Add extra this fields type
*/
extraThisFieldsType<T extends DataList>(): ResolveBehaviorBuilder<
BehaviorBuilder<
TPrevData,
TData,
TDelayedData & T,
TProperty,
TMethod,
TChainingFilter,
TPendingChainingFilter,
TComponentExport
>,
TChainingFilter
> {
return this as any
}
}
Loading

0 comments on commit 896386d

Please sign in to comment.