Skip to content

Commit e9f79c1

Browse files
committed
feat: initial coding
1 parent 43bac46 commit e9f79c1

11 files changed

+1092
-488
lines changed

eslint.config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const prettierRecommended = require('eslint-plugin-prettier/recommended')
55
const promise = require('eslint-plugin-promise')
66

77
const tsconfig = tseslint.config({
8-
files: ["src/**/*.[jt]s", "dist/**/*.[jt]s"],
8+
files: ["src/**/*.[jt]s", "test/**/*.[jt]s"],
99
extends: [
1010
js.configs.recommended,
1111
promise.configs['flat/recommended'],

package-lock.json

+278-386
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/base.ts

+57-57
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ type Lifetimes = {
3737
type PageLifetimes = {
3838
show: () => void
3939
hide: () => void
40-
resize: (size: { width: number; height: number }) => void
40+
resize: (size: WechatMiniprogram.Page.IResizeOption) => void
4141
}
4242

4343
export type GeneralComponent = Component<any, any, any, any>
@@ -83,9 +83,18 @@ class ChainingPolyfillMetadata {
8383
observers: { [key: string]: FuncArr<GeneralFuncType> }
8484

8585
constructor(init: ChainingPolyfillInitData) {
86-
this.lifetimes = init.lifetimes
87-
this.pageLifetimes = init.pageLifetimes
88-
this.observers = init.observers
86+
const cloneMap = (src: { [k: string]: FuncArr<any> }) => {
87+
const dest = {} as typeof src
88+
const keys = Object.keys(src)
89+
for (let i = 0; i < keys.length; i += 1) {
90+
const key = keys[i]!
91+
dest[key] = src[key].clone()
92+
}
93+
return dest
94+
}
95+
this.lifetimes = cloneMap(init.lifetimes)
96+
this.pageLifetimes = cloneMap(init.pageLifetimes)
97+
this.observers = cloneMap(init.observers)
8998
}
9099

91100
setInitDone() {
@@ -170,55 +179,50 @@ const getChainingPolyfillMetadata = (comp: GeneralComponent): ChainingPolyfillMe
170179
return comp._$chainingPolyfill
171180
}
172181

173-
const takeChainingPolyfillInitData = (
174-
comp: GeneralComponent,
175-
): ChainingPolyfillInitData | undefined => {
176-
const id = comp.data._$chainingPolyfillId
177-
if (!(id >= 0)) return undefined
178-
comp.data._$chainingPolyfillId = -1
179-
const initData = initDataMap[id]
180-
const cloneMap = (src: { [k: string]: FuncArr<any> }) => {
181-
const dest = {} as typeof src
182-
const keys = Object.keys(src)
183-
for (let i = 0; i < keys.length; i += 1) {
184-
const key = keys[i]!
185-
dest[key] = src[key].clone()
186-
}
187-
return dest
188-
}
189-
return {
190-
lifetimes: cloneMap(initData.lifetimes),
191-
pageLifetimes: cloneMap(initData.lifetimes),
192-
observers: cloneMap(initData.observers),
193-
initFuncs: initData.initFuncs.clone(),
194-
}
195-
}
196-
197-
const chainingPolyfillBehavior = Behavior({
198-
lifetimes: {
199-
created() {
200-
const self = this as any
201-
const initData = takeChainingPolyfillInitData(self)
202-
if (initData) {
182+
// const takeChainingPolyfillInitData = (
183+
// comp: GeneralComponent,
184+
// ): ChainingPolyfillInitData | undefined => {
185+
// const id = comp.data._$chainingPolyfillId
186+
// if (!(id >= 0)) return undefined
187+
// comp.data._$chainingPolyfillId = -1
188+
// const initData = initDataMap[id]
189+
// const cloneMap = (src: { [k: string]: FuncArr<any> }) => {
190+
// const dest = {} as typeof src
191+
// const keys = Object.keys(src)
192+
// for (let i = 0; i < keys.length; i += 1) {
193+
// const key = keys[i]!
194+
// dest[key] = src[key].clone()
195+
// }
196+
// return dest
197+
// }
198+
// return {
199+
// lifetimes: cloneMap(initData.lifetimes),
200+
// pageLifetimes: cloneMap(initData.pageLifetimes),
201+
// observers: cloneMap(initData.observers),
202+
// initFuncs: initData.initFuncs.clone(),
203+
// }
204+
// }
205+
206+
const generateChainingPolyfillBehavior = (initData: ChainingPolyfillInitData) => {
207+
return Behavior({
208+
lifetimes: {
209+
created() {
203210
const chainingPolyfillMetadata = new ChainingPolyfillMetadata(initData)
204-
self._$chainingPolyfill = chainingPolyfillMetadata
205-
const ctx = chainingPolyfillMetadata.generateBuilderContext(self)
206-
initData.initFuncs.call(self, [ctx, chainingPolyfillMetadata])
211+
;(this as any)._$chainingPolyfill = chainingPolyfillMetadata
212+
const ctx = chainingPolyfillMetadata.generateBuilderContext(this as any)
213+
initData.initFuncs.call(this, [ctx, chainingPolyfillMetadata])
207214
chainingPolyfillMetadata.setInitDone()
208-
}
215+
},
209216
},
210-
},
211-
methods: {
212-
traitBehavior<TOut extends { [x: string]: any }>(
213-
traitBehavior: TraitBehavior<any, TOut>,
214-
): TOut | undefined {
215-
return getChainingPolyfillMetadata(this).traitGroup.get(traitBehavior)
217+
methods: {
218+
traitBehavior<TOut extends { [x: string]: any }>(
219+
traitBehavior: TraitBehavior<any, TOut>,
220+
): TOut | undefined {
221+
return getChainingPolyfillMetadata(this).traitGroup.get(traitBehavior)
222+
},
216223
},
217-
},
218-
})
219-
220-
let behaviorIdInc = 1
221-
const initDataMap: { [id: number]: ChainingPolyfillInitData } = {}
224+
})
225+
}
222226

223227
export class BaseBehaviorBuilder<
224228
TPrevData extends DataList = Empty,
@@ -230,7 +234,6 @@ export class BaseBehaviorBuilder<
230234
TComponentExport = never,
231235
TExtraThisFields extends DataList = Empty,
232236
> {
233-
behaviorId: number
234237
private _$initData = {
235238
lifetimes: {},
236239
pageLifetimes: {},
@@ -241,7 +244,7 @@ export class BaseBehaviorBuilder<
241244
data: {} as DataList,
242245
properties: {} as WechatMiniprogram.Behavior.PropertyOption,
243246
methods: {} as MethodList,
244-
behaviors: [chainingPolyfillBehavior],
247+
behaviors: [generateChainingPolyfillBehavior(this._$initData)],
245248
lifetimes: {
246249
created() {
247250
getChainingPolyfillMetadata(this).callLifetime(this, 'created')
@@ -278,10 +281,8 @@ export class BaseBehaviorBuilder<
278281
}
279282

280283
constructor() {
281-
this.behaviorId = behaviorIdInc
282-
behaviorIdInc += 1
283-
this._$definition.data._$chainingPolyfillId = this.behaviorId
284-
initDataMap[this.behaviorId] = this._$initData
284+
// make observer '**' automatically available
285+
this.observer('**', () => {})
285286
}
286287

287288
/** Add external classes */
@@ -292,7 +293,6 @@ export class BaseBehaviorBuilder<
292293
return this
293294
}
294295

295-
/** Set the export value when the component is being selected */
296296
export<TNewComponentExport>(
297297
f: () => TNewComponentExport,
298298
): ResolveBehaviorBuilder<
@@ -337,7 +337,7 @@ export class BaseBehaviorBuilder<
337337
BaseBehaviorBuilder<
338338
TPrevData,
339339
TData,
340-
TProperty & Record<N, PropertyToData<T>>,
340+
TProperty & Record<N, T>,
341341
TMethod,
342342
TChainingFilter,
343343
TPendingChainingFilter,

src/behavior.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
MethodList,
1212
NewFieldList,
1313
PropertyList,
14-
PropertyToData,
1514
PropertyType,
1615
ResolveBehaviorBuilder,
1716
} from './base'
@@ -82,7 +81,7 @@ export class BehaviorBuilder<
8281
_UChainingFilter extends ChainingFilterType,
8382
UExtraThisFields extends DataList,
8483
>(
85-
behavior: WechatMiniprogram.Behavior.Instance<UData, UProperty, UMethod, any, UExtraThisFields>,
84+
behavior: WechatMiniprogram.Behavior.BehaviorIdentifier<UData, UProperty, UMethod, []>,
8685
): BehaviorBuilder<
8786
TPrevData,
8887
TData & UData,
@@ -120,7 +119,7 @@ export class BehaviorBuilder<
120119
*
121120
* The data should be JSON-compatible, and will be cloned during component creation.
122121
*/
123-
staticData<T extends DataList>(
122+
override staticData<T extends DataList>(
124123
data: NewFieldList<AllData<TData, TProperty>, T>,
125124
): ResolveBehaviorBuilder<
126125
BehaviorBuilder<
@@ -149,7 +148,7 @@ export class BehaviorBuilder<
149148
BehaviorBuilder<
150149
TPrevData,
151150
TData,
152-
TProperty & Record<N, PropertyToData<T>>,
151+
TProperty & Record<N, T>,
153152
TMethod,
154153
TChainingFilter,
155154
TPendingChainingFilter,

src/component.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
MethodList,
1010
NewFieldList,
1111
PropertyList,
12-
PropertyToData,
1312
PropertyType,
1413
ResolveBehaviorBuilder,
1514
ClassicDefinition,
@@ -85,7 +84,7 @@ export class ComponentBuilder<
8584
_UChainingFilter extends ChainingFilterType,
8685
UExtraThisFields extends DataList,
8786
>(
88-
behavior: WechatMiniprogram.Behavior.Instance<UData, UProperty, UMethod, any, UExtraThisFields>,
87+
behavior: WechatMiniprogram.Behavior.BehaviorIdentifier<UData, UProperty, UMethod, []>,
8988
): ComponentBuilder<
9089
TPrevData,
9190
TData & UData,
@@ -123,10 +122,10 @@ export class ComponentBuilder<
123122
*
124123
* The data should be JSON-compatible, and will be cloned during component creation.
125124
*/
126-
staticData<T extends DataList>(
125+
override staticData<T extends DataList>(
127126
data: NewFieldList<AllData<TData, TProperty>, T>,
128127
): ResolveBehaviorBuilder<
129-
BaseBehaviorBuilder<
128+
ComponentBuilder<
130129
T,
131130
TData & T,
132131
TProperty,
@@ -152,7 +151,7 @@ export class ComponentBuilder<
152151
ComponentBuilder<
153152
TPrevData,
154153
TData,
155-
TProperty & Record<N, PropertyToData<T>>,
154+
TProperty & Record<N, T>,
156155
TMethod,
157156
TChainingFilter,
158157
TPendingChainingFilter,

0 commit comments

Comments
 (0)