Skip to content

Commit

Permalink
Merge pull request #155 from wechat-miniprogram/feat-extra-this-field…
Browse files Browse the repository at this point in the history
…s-type

feat: support extraThisFieldsType(#70)
  • Loading branch information
LastLeaf committed May 27, 2024
2 parents d53d8c4 + 5e06f48 commit c3ee78c
Show file tree
Hide file tree
Showing 11 changed files with 356 additions and 83 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,
TExtraThisFields 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, TExtraThisFields>,
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 @@ -32,6 +32,7 @@ export class BaseBehaviorBuilder<
TChainingFilter extends ChainingFilterType = never,
TPendingChainingFilter extends ChainingFilterType = never,
TComponentExport = never,
TExtraThisFields extends DataList = Empty,
> {
protected _$codeSpace!: CodeSpace
protected _$!: glassEasel.BehaviorBuilder<
Expand All @@ -40,7 +41,8 @@ export class BaseBehaviorBuilder<
TProperty,
TMethod,
TChainingFilter,
TPendingChainingFilter
TPendingChainingFilter,
TExtraThisFields
>
protected _$parents: GeneralBehavior[] = []
protected _$export?: (source: GeneralComponent | null) => TComponentExport
Expand Down Expand Up @@ -71,7 +73,8 @@ export class BaseBehaviorBuilder<
TMethod,
TChainingFilter,
TPendingChainingFilter,
TNewComponentExport
TNewComponentExport,
TExtraThisFields
>,
TChainingFilter
> {
Expand All @@ -90,7 +93,8 @@ export class BaseBehaviorBuilder<
TMethod,
TChainingFilter,
TPendingChainingFilter,
TComponentExport
TComponentExport,
TExtraThisFields
>,
TChainingFilter
> {
Expand All @@ -109,7 +113,8 @@ export class BaseBehaviorBuilder<
TMethod,
TChainingFilter,
TPendingChainingFilter,
TComponentExport
TComponentExport,
TExtraThisFields
>,
TChainingFilter
> {
Expand All @@ -123,7 +128,7 @@ 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, TExtraThisFields>>,
): ResolveBehaviorBuilder<
BaseBehaviorBuilder<
TPrevData,
Expand All @@ -132,7 +137,8 @@ export class BaseBehaviorBuilder<
TMethod & T,
TChainingFilter,
TPendingChainingFilter,
TComponentExport
TComponentExport,
TExtraThisFields
>,
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, TExtraThisFields>, newValue: V) => void,
once?: boolean,
): ResolveBehaviorBuilder<this, TChainingFilter>
observer<
Expand All @@ -169,14 +175,17 @@ export class BaseBehaviorBuilder<
>(
paths: readonly [...P],
func: (
this: Component<TData, TProperty, TMethod, any>,
this: Component<TData, TProperty, TMethod, any, TExtraThisFields>,
...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, TExtraThisFields>,
...args: any[]
) => any,
once = false,
): ResolveBehaviorBuilder<this, TChainingFilter> {
this._$.observer(paths as any, func as any, once)
Expand All @@ -189,7 +198,7 @@ export class BaseBehaviorBuilder<
lifetime<L extends keyof Lifetimes>(
name: L,
func: (
this: Component<TData, TProperty, TMethod, any>,
this: Component<TData, TProperty, TMethod, any, TExtraThisFields>,
...args: Parameters<Lifetimes[L]>
) => ReturnType<Lifetimes[L]>,
once = false,
Expand All @@ -203,7 +212,10 @@ export class BaseBehaviorBuilder<
*/
pageLifetime(
name: string,
func: (this: Component<TData, TProperty, TMethod, any>, ...args: any[]) => any,
func: (
this: Component<TData, TProperty, TMethod, any, TExtraThisFields>,
...args: any[]
) => any,
once = false,
): ResolveBehaviorBuilder<this, TChainingFilter> {
this._$.pageLifetime(name, func as any, once)
Expand All @@ -215,7 +227,8 @@ export class BaseBehaviorBuilder<
*/
relation(
name: string,
rel: RelationParams & ThisType<Component<TData, TProperty, TMethod, TComponentExport>>,
rel: RelationParams &
ThisType<Component<TData, TProperty, TMethod, TComponentExport, TExtraThisFields>>,
): ResolveBehaviorBuilder<this, TChainingFilter> {
const target =
rel.target instanceof Behavior || rel.target instanceof ComponentType
Expand All @@ -234,11 +247,11 @@ 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, TExtraThisFields>,
builderContext: BuilderContext<
TPrevData,
TProperty,
Component<TData, TProperty, TMethod, TComponentExport>
Component<TData, TProperty, TMethod, TComponentExport, TExtraThisFields>
>,
) => TExport,
// eslint-disable-next-line function-paren-newline
Expand All @@ -250,7 +263,8 @@ export class BaseBehaviorBuilder<
TMethod,
TChainingFilter,
TPendingChainingFilter,
TComponentExport
TComponentExport,
TExtraThisFields
>,
TChainingFilter
> {
Expand Down Expand Up @@ -294,7 +308,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,
TExtraThisFields
>

return func.call(methodCaller, {
self: methodCaller,
Expand Down Expand Up @@ -331,7 +351,8 @@ export class BaseBehaviorBuilder<
TData & TNewData,
TProperty & TNewProperty,
TMethod & TNewMethod,
TNewComponentExport
TNewComponentExport,
TExtraThisFields
>
>,
): ResolveBehaviorBuilder<
Expand All @@ -342,7 +363,8 @@ export class BaseBehaviorBuilder<
TMethod & TNewMethod,
TChainingFilter,
TPendingChainingFilter,
TNewComponentExport
TNewComponentExport,
TExtraThisFields
>,
TChainingFilter
> {
Expand Down
Loading

0 comments on commit c3ee78c

Please sign in to comment.