Skip to content

Commit

Permalink
feat(adapter): support export properly
Browse files Browse the repository at this point in the history
  • Loading branch information
Tidyzq committed Nov 16, 2023
1 parent 7742f82 commit 8995008
Show file tree
Hide file tree
Showing 5 changed files with 227 additions and 47 deletions.
6 changes: 6 additions & 0 deletions glass-easel-miniprogram-adapter/src/behavior.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as glassEasel from 'glass-easel'

Check warning on line 1 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (lts/*, windows-latest)

All imports in the declaration are only used as types. Use `import type`

Check warning on line 1 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (lts/*, ubuntu-latest)

All imports in the declaration are only used as types. Use `import type`

Check warning on line 1 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (latest, windows-latest)

All imports in the declaration are only used as types. Use `import type`

Check warning on line 1 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (latest, ubuntu-latest)

All imports in the declaration are only used as types. Use `import type`
import { GeneralComponentDefinition, utils as typeUtils } from './types'

Check warning on line 2 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (lts/*, windows-latest)

All imports in the declaration are only used as types. Use `import type`

Check warning on line 2 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (lts/*, ubuntu-latest)

All imports in the declaration are only used as types. Use `import type`

Check warning on line 2 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (latest, windows-latest)

All imports in the declaration are only used as types. Use `import type`

Check warning on line 2 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (latest, ubuntu-latest)

All imports in the declaration are only used as types. Use `import type`
import { GeneralComponent } from './component'

Check warning on line 3 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (lts/*, windows-latest)

All imports in the declaration are only used as types. Use `import type`

Check warning on line 3 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (lts/*, ubuntu-latest)

All imports in the declaration are only used as types. Use `import type`

Check warning on line 3 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (latest, windows-latest)

All imports in the declaration are only used as types. Use `import type`

Check warning on line 3 in glass-easel-miniprogram-adapter/src/behavior.ts

View workflow job for this annotation

GitHub Actions / Build and Test (latest, ubuntu-latest)

All imports in the declaration are only used as types. Use `import type`

type DataList = typeUtils.DataList
type PropertyList = typeUtils.PropertyList
Expand All @@ -23,19 +24,24 @@ export class Behavior<
TProperty extends PropertyList,
TMethod extends MethodList,
TChainingFilter extends ChainingFilterType,
TComponentExport = never,
> {
/** @internal */
_$: glassEasel.GeneralBehavior
/** @internal */
_$bindedDefinitionFilter?: (target: GeneralComponentDefinition) => void
/** @internal */
_$export?: (source: GeneralComponent | null) => TComponentExport

/** @internal */
constructor(
inner: glassEasel.Behavior<TData, TProperty, TMethod, TChainingFilter>,
parents: GeneralBehavior[],
definitionFilter: DefinitionFilter | undefined,
componentExport: ((source: GeneralComponent | null) => TComponentExport) | undefined,
) {
this._$ = inner as glassEasel.GeneralBehavior
this._$export = componentExport

// processing definition filter
if (definitionFilter !== undefined) {
Expand Down
9 changes: 6 additions & 3 deletions glass-easel-miniprogram-adapter/src/component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ type ExportType<
UProperty extends PropertyList,
UMethod extends MethodList,
UComponentExport,
> = UComponentExport extends undefined
> = [UComponentExport] extends [never]
? Component<UData, UProperty, UMethod, UComponentExport>
: UComponentExport

Expand Down Expand Up @@ -52,7 +52,7 @@ const filterComponentExport = (
source: ComponentCaller<any, any, any, any>,
elem: glassEasel.Element,
): any => {
if (elem instanceof glassEasel.Component) {
if (glassEasel.Component.isComponent(elem)) {
const selectedSpace = elem.getRootBehavior().ownerSpace
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const uncheckedCaller = elem.getMethodCaller()
Expand Down Expand Up @@ -477,7 +477,10 @@ export class ComponentProto<
> {
private proto: Component<TData, TProperty, TMethod, TComponentExport>

constructor(methods: TMethod, componentExport?: () => TComponentExport) {
constructor(
methods: TMethod,
componentExport?: (source: GeneralComponent | null) => TComponentExport,
) {
this.proto = Object.create(ComponentCaller.prototype) as Component<
TData,
TProperty,
Expand Down
102 changes: 74 additions & 28 deletions glass-easel-miniprogram-adapter/src/space.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,9 @@ export interface BehaviorConstructor {
TData extends DataList,
TProperty extends PropertyList,
TMethod extends MethodList,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
TComponentExport,
>(
definition: BehaviorDefinition<TData, TProperty, TMethod>,
definition: BehaviorDefinition<TData, TProperty, TMethod, TComponentExport>,
): Behavior<TData, TProperty, TMethod, never>
trait<TIn extends { [key: string]: any }>(): TraitBehavior<TIn, TIn>
trait<TIn extends { [key: string]: any }, TOut extends { [key: string]: any }>(
Expand Down Expand Up @@ -441,18 +440,16 @@ export class CodeSpace {
TData extends DataList,
TProperty extends PropertyList,
TMethod extends MethodList,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
TComponentExport,
>(
definition: BehaviorDefinition<TData, TProperty, TMethod>,
definition: BehaviorDefinition<TData, TProperty, TMethod, TComponentExport>,
): Behavior<TData, TProperty, TMethod, never>
function behaviorConstructor<
TData extends DataList,
TProperty extends PropertyList,
TMethod extends MethodList,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
TComponentExport,
>(definition?: BehaviorDefinition<TData, TProperty, TMethod>) {
>(definition?: BehaviorDefinition<TData, TProperty, TMethod, TComponentExport>) {
if (definition !== undefined) {
return self.behavior().definition(definition).register()
}
Expand Down Expand Up @@ -521,7 +518,7 @@ export class BaseBehaviorBuilder<
TMethod extends MethodList = Empty,
TChainingFilter extends ChainingFilterType = never,
TPendingChainingFilter extends ChainingFilterType = never,
TComponentExport = undefined,
TComponentExport = never,
> {
protected _$codeSpace!: CodeSpace
protected _$!: glassEasel.BehaviorBuilder<
Expand All @@ -533,6 +530,7 @@ export class BaseBehaviorBuilder<
TPendingChainingFilter
>
protected _$parents: GeneralBehavior[] = []
protected _$export?: (source: GeneralComponent | null) => TComponentExport

/** Implement a trait behavior */
implement<TIn extends { [key: string]: any }>(
Expand All @@ -549,6 +547,26 @@ export class BaseBehaviorBuilder<
return this
}

/** Set the export value when the component is being selected */
export<TNewComponentExport>(
f: (this: GeneralComponent, source: GeneralComponent | null) => TNewComponentExport,
): ResolveBehaviorBuilder<
BaseBehaviorBuilder<
TPrevData,
TData,
TProperty,
TMethod,
TChainingFilter,
TPendingChainingFilter,
TNewComponentExport
>,
TChainingFilter
> {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
this._$export = f as any
return this as any
}

data<T extends DataList>(
gen: () => typeUtils.NewFieldList<AllData<TData, TProperty>, T>,
): ResolveBehaviorBuilder<
Expand Down Expand Up @@ -791,14 +809,15 @@ export class BaseBehaviorBuilder<
TNewData extends DataList = Empty,
TNewProperty extends PropertyList = Empty,
TNewMethod extends MethodList = Empty,
TNewComponentExport = never,
>(
def: BehaviorDefinition<TNewData, TNewProperty, TNewMethod> &
def: BehaviorDefinition<TNewData, TNewProperty, TNewMethod, TNewComponentExport> &
ThisType<
Component<
TData & TNewData,
TProperty & TNewProperty,
TMethod & TNewMethod,
TComponentExport
TNewComponentExport
>
>,
): ResolveBehaviorBuilder<
Expand All @@ -809,7 +828,7 @@ export class BaseBehaviorBuilder<
TMethod & TNewMethod,
TChainingFilter,
TPendingChainingFilter,
TComponentExport
TNewComponentExport
>,
TChainingFilter
> {
Expand All @@ -830,6 +849,7 @@ export class BaseBehaviorBuilder<
pageLifetimes: rawPageLifetimes,
relations: rawRelations,
externalClasses,
export: exports,
} = def
behaviors?.forEach((beh) => {
this._$parents.push(beh as GeneralBehavior)
Expand Down Expand Up @@ -896,6 +916,8 @@ export class BaseBehaviorBuilder<
}
}
if (externalClasses) inner.externalClasses(externalClasses)
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
if (exports) this._$export = exports as any
return this as any
}
}
Expand All @@ -907,7 +929,7 @@ export class BehaviorBuilder<
TMethod extends MethodList = Empty,
TChainingFilter extends ChainingFilterType = never,
TPendingChainingFilter extends ChainingFilterType = never,
TComponentExport = undefined,
TComponentExport = never,
> extends BaseBehaviorBuilder<
TPrevData,
TData,
Expand Down Expand Up @@ -978,6 +1000,24 @@ export class BehaviorBuilder<
return this as any
}

/** Set the export value when the component is being selected */
override export<TNewComponentExport>(
f: (this: GeneralComponent, source: GeneralComponent | null) => TNewComponentExport,
): ResolveBehaviorBuilder<
BehaviorBuilder<
TPrevData,
TData,
TProperty,
TMethod,
TChainingFilter,
TPendingChainingFilter,
TNewComponentExport
>,
TChainingFilter
> {
return super.export(f) as any
}

/**
* Add some template data fields
*
Expand Down Expand Up @@ -1083,14 +1123,15 @@ export class BehaviorBuilder<
TNewData extends DataList = Empty,
TNewProperty extends PropertyList = Empty,
TNewMethod extends MethodList = Empty,
TNewComponentExport = never
>(
def: BehaviorDefinition<TNewData, TNewProperty, TNewMethod> &
def: BehaviorDefinition<TNewData, TNewProperty, TNewMethod, TNewComponentExport> &
ThisType<
Component<
TData & TNewData,
TProperty & TNewProperty,
TMethod & TNewMethod,
TComponentExport
TNewComponentExport
>
>,
): ResolveBehaviorBuilder<
Expand All @@ -1101,7 +1142,7 @@ export class BehaviorBuilder<
TMethod & TNewMethod,
TChainingFilter,
TPendingChainingFilter,
TComponentExport
TNewComponentExport
>,
TChainingFilter
> {
Expand All @@ -1113,8 +1154,13 @@ export class BehaviorBuilder<
/**
* Finish the behavior definition process
*/
register(): Behavior<TData, TProperty, TMethod, TPendingChainingFilter> {
return new Behavior(this._$.registerBehavior(), this._$parents, this._$definitionFilter)
register(): Behavior<TData, TProperty, TMethod, TPendingChainingFilter, TComponentExport> {
return new Behavior(
this._$.registerBehavior(),
this._$parents,
this._$definitionFilter,
this._$export,
)
}
}

Expand All @@ -1128,7 +1174,7 @@ export class ComponentBuilder<
TMethod extends MethodList = Empty,
TChainingFilter extends ChainingFilterType = never,
TPendingChainingFilter extends ChainingFilterType = never,
TComponentExport = undefined,
TComponentExport = never,
> extends BaseBehaviorBuilder<
TPrevData,
TData,
Expand All @@ -1141,7 +1187,6 @@ export class ComponentBuilder<
private _$is!: string
private _$alias?: string[]
private _$options?: ComponentDefinitionOptions
private _$export?: (source: GeneralComponent | null) => TComponentExport
private _$proto?: ComponentProto<TData, TProperty, TMethod, TComponentExport>

/** @internal */
Expand All @@ -1158,12 +1203,11 @@ export class ComponentBuilder<
if (proto === undefined) {
const methods = originalCaller.getComponentDefinition().behavior.getMethods()
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
proto = ret._$proto = new ComponentProto(methods) as any
proto = ret._$proto = new ComponentProto(methods, ret._$export) as any
}
const caller = proto!.derive()
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
caller._$ = originalCaller as any
caller._$export = ret._$export
return caller
})
if (overallBehavior) ret._$.behavior(overallBehavior)
Expand All @@ -1186,8 +1230,9 @@ export class ComponentBuilder<
UProperty extends PropertyList,
UMethod extends MethodList,
UChainingFilter extends ChainingFilterType,
UComponentExport,
>(
behavior: Behavior<UData, UProperty, UMethod, UChainingFilter>,
behavior: Behavior<UData, UProperty, UMethod, UChainingFilter, UComponentExport>,
): ResolveBehaviorBuilder<
ComponentBuilder<
TPrevData,
Expand All @@ -1196,22 +1241,23 @@ export class ComponentBuilder<
TMethod & UMethod,
UChainingFilter,
TPendingChainingFilter,
TComponentExport
UComponentExport
>,
UChainingFilter
> {
this._$parents.push(behavior as GeneralBehavior)
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
this._$ = this._$.behavior(behavior._$)
if (behavior._$export) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
this._$export = behavior._$export as any
}
return this as any
}

/** Set the export value when the component is being selected */
export<TNewComponentExport>(
f: (
this: Component<TData, TProperty, TMethod, TComponentExport>,
source: GeneralComponent | null,
) => TNewComponentExport,
override export<TNewComponentExport>(
f: (this: GeneralComponent, source: GeneralComponent | null) => TNewComponentExport,
): ResolveBehaviorBuilder<
ComponentBuilder<
TPrevData,
Expand Down Expand Up @@ -1334,7 +1380,7 @@ export class ComponentBuilder<
TNewData extends DataList = Empty,
TNewProperty extends PropertyList = Empty,
TNewMethod extends MethodList = Empty,
TNewComponentExport = undefined,
TNewComponentExport = never,
>(
def: ComponentDefinition<TNewData, TNewProperty, TNewMethod, TNewComponentExport> &
ThisType<
Expand Down
8 changes: 5 additions & 3 deletions glass-easel-miniprogram-adapter/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { DeepCopyKind, typeUtils as utils } from 'glass-easel'
import type { DefinitionFilter, GeneralBehavior, Behavior } from './behavior'
import { GeneralComponent } from './component'

export { typeUtils as utils } from 'glass-easel'

Expand Down Expand Up @@ -40,8 +41,9 @@ export type BehaviorDefinition<
TData extends utils.DataList,
TProperty extends utils.PropertyList,
TMethod extends utils.MethodList,
TComponentExport,
> = {
behaviors?: Behavior<any, any, any, any>[]
behaviors?: Behavior<any, any, any, any, any>[]
properties?: TProperty
data?: TData | (() => TData)
observers?:
Expand All @@ -61,6 +63,7 @@ export type BehaviorDefinition<
relations?: utils.RelationParamsWithKey
externalClasses?: string[]
definitionFilter?: DefinitionFilter
export?: (source: GeneralComponent | null) => TComponentExport
}

export type ComponentDefinition<
Expand All @@ -70,8 +73,7 @@ export type ComponentDefinition<
TComponentExport,
> = {
options?: ComponentDefinitionOptions
export?: () => TComponentExport
} & BehaviorDefinition<TData, TProperty, TMethod>
} & BehaviorDefinition<TData, TProperty, TMethod, TComponentExport>

export type GeneralComponentDefinition = ComponentDefinition<any, any, any, any>

Expand Down
Loading

0 comments on commit 8995008

Please sign in to comment.