glass-easel 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/.eslintignore +4 -0
  2. package/dist/glass_easel.all.js +2 -2
  3. package/dist/glass_easel.all.js.map +1 -1
  4. package/dist/glass_easel.d.ts +2546 -0
  5. package/dist/glass_easel.domlike.global.js +2 -2
  6. package/dist/glass_easel.domlike.global.js.map +1 -1
  7. package/guide/zh_CN/appendix/backend_protocol.md +164 -74
  8. package/jest.unit.config.js +7 -4
  9. package/package.json +7 -5
  10. package/rollup.config.ts +101 -0
  11. package/src/backend/backend_protocol.ts +26 -345
  12. package/src/backend/composed_backend_protocol.ts +10 -264
  13. package/src/backend/current_window_backend_context.ts +478 -0
  14. package/src/backend/domlike_backend_protocol.ts +9 -498
  15. package/src/backend/empty_backend.ts +265 -0
  16. package/src/backend/empty_composed_backend.ts +245 -0
  17. package/src/backend/index.ts +18 -0
  18. package/src/backend/suggested_backend_protocol.ts +62 -11
  19. package/src/behavior.ts +131 -442
  20. package/src/class_list.ts +328 -222
  21. package/src/component.ts +349 -184
  22. package/src/component_params.ts +54 -25
  23. package/src/component_space.ts +36 -15
  24. package/src/data_path.ts +22 -34
  25. package/src/data_proxy.ts +334 -27
  26. package/src/devtool.ts +89 -0
  27. package/src/element.ts +667 -285
  28. package/src/element_iterator.ts +9 -4
  29. package/src/event.ts +39 -20
  30. package/src/external_shadow_tree.ts +2 -2
  31. package/src/func_arr.ts +55 -101
  32. package/src/global_options.ts +18 -42
  33. package/src/index.ts +72 -73
  34. package/src/mutation_observer.ts +10 -7
  35. package/src/native_node.ts +79 -35
  36. package/src/node.ts +23 -30
  37. package/src/relation.ts +101 -12
  38. package/src/render.ts +5 -3
  39. package/src/selector.ts +9 -7
  40. package/src/shadow_root.ts +96 -240
  41. package/src/template_engine.ts +10 -7
  42. package/src/text_node.ts +43 -19
  43. package/src/tmpl/index.ts +38 -30
  44. package/src/tmpl/native_rendering.ts +14 -21
  45. package/src/tmpl/proc_gen_wrapper.ts +189 -151
  46. package/src/tmpl/proc_gen_wrapper_dom.ts +10 -8
  47. package/src/tmpl/range_list_diff.ts +30 -9
  48. package/src/trait_behaviors.ts +1 -1
  49. package/src/type_symbol.ts +36 -0
  50. package/src/virtual_node.ts +26 -13
  51. package/src/warning.ts +119 -0
  52. package/tests/base/composed_backend.ts +143 -142
  53. package/tests/base/env.ts +76 -3
  54. package/tests/base/match.ts +24 -22
  55. package/tests/base/shadow_backend.ts +917 -0
  56. package/tests/core/backend.test.ts +53 -1
  57. package/tests/core/behavior.test.ts +1 -1
  58. package/tests/core/data_update.test.ts +135 -0
  59. package/tests/core/misc.test.ts +91 -21
  60. package/tests/core/placeholder.test.ts +66 -25
  61. package/tests/core/slot.test.ts +161 -23
  62. package/tests/legacy/component.test.js +152 -78
  63. package/tests/legacy/data_path.test.js +19 -19
  64. package/tests/legacy/data_proxy.test.js +14 -7
  65. package/tests/legacy/external.test.js +8 -8
  66. package/tests/legacy/mutation_observer.test.js +7 -5
  67. package/tests/legacy/slot.test.js +2 -3
  68. package/tests/legacy/virtual.test.js +258 -25
  69. package/tests/tmpl/binding_map.test.ts +201 -195
  70. package/tests/tmpl/event.test.ts +138 -23
  71. package/tests/tmpl/expression.test.ts +15 -15
  72. package/tests/tmpl/lvalue.test.ts +101 -0
  73. package/tests/tmpl/structure.test.ts +486 -43
  74. package/tests/types/chaining.test.ts +27 -30
  75. package/tests/types/createElement.test.ts +5 -4
  76. package/tests/types/definition.test.ts +11 -14
  77. package/tsconfig.json +1 -3
  78. package/dist/glass_easel.all.d.ts +0 -1
  79. package/dist/glass_easel.domlike.global.d.ts +0 -1
  80. package/dist/index.d.ts +0 -1
  81. package/dist/index.js +0 -1
  82. package/dist/types/src/backend/backend_protocol.d.ts +0 -141
  83. package/dist/types/src/backend/backend_protocol.d.ts.map +0 -1
  84. package/dist/types/src/backend/composed_backend_protocol.d.ts +0 -102
  85. package/dist/types/src/backend/composed_backend_protocol.d.ts.map +0 -1
  86. package/dist/types/src/backend/domlike_backend_protocol.d.ts +0 -100
  87. package/dist/types/src/backend/domlike_backend_protocol.d.ts.map +0 -1
  88. package/dist/types/src/backend/mode.d.ts +0 -65
  89. package/dist/types/src/backend/mode.d.ts.map +0 -1
  90. package/dist/types/src/backend/suggested_backend_protocol.d.ts +0 -30
  91. package/dist/types/src/backend/suggested_backend_protocol.d.ts.map +0 -1
  92. package/dist/types/src/behavior.d.ts +0 -434
  93. package/dist/types/src/behavior.d.ts.map +0 -1
  94. package/dist/types/src/class_list.d.ts +0 -83
  95. package/dist/types/src/class_list.d.ts.map +0 -1
  96. package/dist/types/src/component.d.ts +0 -325
  97. package/dist/types/src/component.d.ts.map +0 -1
  98. package/dist/types/src/component_params.d.ts +0 -236
  99. package/dist/types/src/component_params.d.ts.map +0 -1
  100. package/dist/types/src/component_space.d.ts +0 -211
  101. package/dist/types/src/component_space.d.ts.map +0 -1
  102. package/dist/types/src/data_path.d.ts +0 -5
  103. package/dist/types/src/data_path.d.ts.map +0 -1
  104. package/dist/types/src/data_proxy.d.ts +0 -107
  105. package/dist/types/src/data_proxy.d.ts.map +0 -1
  106. package/dist/types/src/data_utils.d.ts +0 -3
  107. package/dist/types/src/data_utils.d.ts.map +0 -1
  108. package/dist/types/src/element.d.ts +0 -365
  109. package/dist/types/src/element.d.ts.map +0 -1
  110. package/dist/types/src/element_iterator.d.ts +0 -43
  111. package/dist/types/src/element_iterator.d.ts.map +0 -1
  112. package/dist/types/src/event.d.ts +0 -105
  113. package/dist/types/src/event.d.ts.map +0 -1
  114. package/dist/types/src/external_shadow_tree.d.ts +0 -20
  115. package/dist/types/src/external_shadow_tree.d.ts.map +0 -1
  116. package/dist/types/src/func_arr.d.ts +0 -39
  117. package/dist/types/src/func_arr.d.ts.map +0 -1
  118. package/dist/types/src/global_options.d.ts +0 -120
  119. package/dist/types/src/global_options.d.ts.map +0 -1
  120. package/dist/types/src/index.d.ts +0 -43
  121. package/dist/types/src/index.d.ts.map +0 -1
  122. package/dist/types/src/mutation_observer.d.ts +0 -79
  123. package/dist/types/src/mutation_observer.d.ts.map +0 -1
  124. package/dist/types/src/native_node.d.ts +0 -11
  125. package/dist/types/src/native_node.d.ts.map +0 -1
  126. package/dist/types/src/node.d.ts +0 -48
  127. package/dist/types/src/node.d.ts.map +0 -1
  128. package/dist/types/src/relation.d.ts +0 -46
  129. package/dist/types/src/relation.d.ts.map +0 -1
  130. package/dist/types/src/render.d.ts +0 -3
  131. package/dist/types/src/render.d.ts.map +0 -1
  132. package/dist/types/src/selector.d.ts +0 -32
  133. package/dist/types/src/selector.d.ts.map +0 -1
  134. package/dist/types/src/shadow_root.d.ts +0 -174
  135. package/dist/types/src/shadow_root.d.ts.map +0 -1
  136. package/dist/types/src/template_engine.d.ts +0 -56
  137. package/dist/types/src/template_engine.d.ts.map +0 -1
  138. package/dist/types/src/text_node.d.ts +0 -44
  139. package/dist/types/src/text_node.d.ts.map +0 -1
  140. package/dist/types/src/tmpl/index.d.ts +0 -19
  141. package/dist/types/src/tmpl/index.d.ts.map +0 -1
  142. package/dist/types/src/tmpl/native_rendering.d.ts +0 -45
  143. package/dist/types/src/tmpl/native_rendering.d.ts.map +0 -1
  144. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts +0 -89
  145. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts.map +0 -1
  146. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts +0 -50
  147. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts.map +0 -1
  148. package/dist/types/src/tmpl/range_list_diff.d.ts +0 -19
  149. package/dist/types/src/tmpl/range_list_diff.d.ts.map +0 -1
  150. package/dist/types/src/trait_behaviors.d.ts +0 -38
  151. package/dist/types/src/trait_behaviors.d.ts.map +0 -1
  152. package/dist/types/src/virtual_node.d.ts +0 -10
  153. package/dist/types/src/virtual_node.d.ts.map +0 -1
  154. package/dist/types/tests/backend/domlike.test.d.ts +0 -2
  155. package/dist/types/tests/backend/domlike.test.d.ts.map +0 -1
  156. package/dist/types/tests/base/composed_backend.d.ts +0 -123
  157. package/dist/types/tests/base/composed_backend.d.ts.map +0 -1
  158. package/dist/types/tests/base/env.d.ts +0 -30
  159. package/dist/types/tests/base/env.d.ts.map +0 -1
  160. package/dist/types/tests/base/match.d.ts +0 -9
  161. package/dist/types/tests/base/match.d.ts.map +0 -1
  162. package/dist/types/tests/core/backend.test.d.ts +0 -2
  163. package/dist/types/tests/core/backend.test.d.ts.map +0 -1
  164. package/dist/types/tests/core/behavior.test.d.ts +0 -2
  165. package/dist/types/tests/core/behavior.test.d.ts.map +0 -1
  166. package/dist/types/tests/core/component_space.test.d.ts +0 -2
  167. package/dist/types/tests/core/component_space.test.d.ts.map +0 -1
  168. package/dist/types/tests/core/data_update.test.d.ts +0 -2
  169. package/dist/types/tests/core/data_update.test.d.ts.map +0 -1
  170. package/dist/types/tests/core/misc.test.d.ts +0 -2
  171. package/dist/types/tests/core/misc.test.d.ts.map +0 -1
  172. package/dist/types/tests/core/placeholder.test.d.ts +0 -2
  173. package/dist/types/tests/core/placeholder.test.d.ts.map +0 -1
  174. package/dist/types/tests/core/slot.test.d.ts +0 -2
  175. package/dist/types/tests/core/slot.test.d.ts.map +0 -1
  176. package/dist/types/tests/core/trait_behaviors.test.d.ts +0 -2
  177. package/dist/types/tests/core/trait_behaviors.test.d.ts.map +0 -1
  178. package/dist/types/tests/tmpl/binding_map.test.d.ts +0 -2
  179. package/dist/types/tests/tmpl/binding_map.test.d.ts.map +0 -1
  180. package/dist/types/tests/tmpl/event.test.d.ts +0 -2
  181. package/dist/types/tests/tmpl/event.test.d.ts.map +0 -1
  182. package/dist/types/tests/tmpl/expression.test.d.ts +0 -2
  183. package/dist/types/tests/tmpl/expression.test.d.ts.map +0 -1
  184. package/dist/types/tests/tmpl/lvalue.test.d.ts +0 -2
  185. package/dist/types/tests/tmpl/lvalue.test.d.ts.map +0 -1
  186. package/dist/types/tests/tmpl/native_rendering.test.d.ts +0 -2
  187. package/dist/types/tests/tmpl/native_rendering.test.d.ts.map +0 -1
  188. package/dist/types/tests/tmpl/structure.test.d.ts +0 -2
  189. package/dist/types/tests/tmpl/structure.test.d.ts.map +0 -1
  190. package/dist/types/tests/types/chaining.test.d.ts +0 -2
  191. package/dist/types/tests/types/chaining.test.d.ts.map +0 -1
  192. package/dist/types/tests/types/createElement.test.d.ts +0 -2
  193. package/dist/types/tests/types/createElement.test.d.ts.map +0 -1
  194. package/dist/types/tests/types/definition.test.d.ts +0 -2
  195. package/dist/types/tests/types/definition.test.d.ts.map +0 -1
  196. package/webpack.config.js +0 -275
  197. /package/src/backend/{mode.ts → shared.ts} +0 -0
@@ -22,6 +22,7 @@ glass-easel 支持自定义后端。后端必须向 glass-easel 提供以下这
22
22
  * 文本节点(仅承载文本,无子节点);
23
23
  * 片段节点(用于临时承载节点树片段);
24
24
  * 组件节点(仅 Shadow Mode ,拥有自己的 shadow tree ,可为虚拟或非虚拟);
25
+ * 组件根节点(仅 Shadow Mode,组件的 shadowRoot 节点);
25
26
  * 虚拟节点(仅 Shadow Mode )。
26
27
 
27
28
  ### 接口形式
@@ -97,6 +98,46 @@ glass-easel 并不会自行调用这个接口。应由其他模块调用这个
97
98
 
98
99
  禁用一段已插入的样式表。
99
100
 
101
+ ### `Context#render(cb: (Error | null) => void): void`
102
+
103
+ 等待下一次渲染完成时的回调,即与后端节拍器对齐。
104
+
105
+ 后端必须保证回调是异步的。在回调中,设置新的属性应能触发 CSS transition 动画。
106
+
107
+ ### `Context#getRootNode(): Element`
108
+
109
+ 获得根节点。
110
+
111
+ **在 Shadow Mode 下** ,根节点必须是组件根节点; **在 Composed Mode 下** ,根节点必须是普通节点。
112
+
113
+ ### `Context#createElement(tagName: string): Element`
114
+
115
+ 创建一个普通节点。
116
+
117
+ **仅 Composed Mode 有效。**
118
+
119
+ ### `Context#createTextNode(content: string): Element`
120
+
121
+ 创建一个文本节点。
122
+
123
+ **仅 Composed Mode 有效。**
124
+
125
+ ### `Context#createFragment(): Element`
126
+
127
+ 创建一个片段节点。它用于表示节点数组,方便批量插入和移除节点。
128
+
129
+ ### `Context#onEvent(listener: (target: Node, type: string, detail: any, options: EventOptions) => EventBubbleStatus | void): void`
130
+
131
+ 设置全局事件回调函数。这个回调函数只有一个。
132
+
133
+ **仅 Composed Mode 有效**,Shadow Mode 参考下一个签名。
134
+
135
+ ### `Context#onEvent(createEvent: (type: string, detail: unknown, options: EventOptions) => Event<unknown>, listener: (event: Event<unknown>, currentTarget: Node, mark: Record<string, unknown> | null, target: Node, isCapture: boolean) => EventBubbleStatus | void): void`
136
+
137
+ 设置全局事件回调函数。这个回调函数只有一个。
138
+
139
+ **仅 Shadow Mode 有效**,Composed Mode 参考上一个签名。
140
+
100
141
  ### `Context#addStyleSheetRule(mediaQueryStr: string, selector: string): number | null`
101
142
 
102
143
  插入一段样式表规则,返回它对应的规则序号。
@@ -169,38 +210,6 @@ glass-easel 并不会自行调用这个接口。应由其他模块调用这个
169
210
 
170
211
  **这只是一个建议性质的接口。** glass-easel 并不会自行调用这个接口,但其他相关模块很可能调用。
171
212
 
172
- ### `Context#render(cb: (Error | null) => void): void`
173
-
174
- 等待下一次渲染完成时的回调,即与后端节拍器对齐。
175
-
176
- 后端必须保证回调是异步的。在回调中,设置新的属性应能触发 CSS transition 动画。
177
-
178
- ### `Context#getRootNode(): Element`
179
-
180
- 获得根节点。
181
-
182
- **在 Shadow Mode 下** ,根节点必须是组件节点; **在 Composed Mode 下** ,根节点必须是普通节点。
183
-
184
- ### `Context#createElement(tagName: string): Element`
185
-
186
- 创建一个普通节点。
187
-
188
- **仅 Composed Mode 有效。**
189
-
190
- ### `Context#createTextNode(content: string): Element`
191
-
192
- 创建一个文本节点。
193
-
194
- **仅 Composed Mode 有效。**
195
-
196
- ### `Context#createFragment(): Element`
197
-
198
- 创建一个片段节点。它用于表示节点数组,方便批量插入和移除节点。
199
-
200
- ### `Context#onEvent(listener: (target: Node, type: string, detail: any, options: EventOptions) => EventBubbleStatus): void`
201
-
202
- 设置全局事件回调函数。这个回调函数只有一个。
203
-
204
213
  ### `Context#setFocusedNode(target: Node): void`
205
214
 
206
215
  设置焦点所在节点。如果节点不可聚焦,则移除焦点。
@@ -225,6 +234,7 @@ glass-easel 并不会自行调用这个接口。应由其他模块调用这个
225
234
 
226
235
  监听器必然在开始监听时触发一次,用于返回初始的媒体查询状态信息。
227
236
 
237
+ **这只是一个建议性质的接口。** glass-easel 并不会自行调用这个接口,但其他相关模块很可能调用。
228
238
 
229
239
  ## Element
230
240
 
@@ -232,11 +242,11 @@ glass-easel 并不会自行调用这个接口。应由其他模块调用这个
232
242
 
233
243
  释放一个节点。
234
244
 
235
- ### `Element#associateValue(associatedValue?: Node): void`
245
+ ### `Element#associateValue(associatedValue?: Element): void`
236
246
 
237
- 通知节点相关信息已经创建完毕,并为节点设置一个关联值。对除文本节点以外的节点都会调用一次。
247
+ 通知节点相关信息已经创建完毕,并为节点设置一个关联值。
238
248
 
239
- 对于使用 `Context#createElement` 或 `ShadowRootContext#createComponent` 创建的节点,会被调用且仅被调用一次;对于其他节点,不会被调用。
249
+ 创建的节点会被调用且仅被调用一次;文本 (TextNode) 节点,不会被调用。
240
250
 
241
251
  ### `Element#getShadowRoot(): ShadowRootContext | undefined`
242
252
 
@@ -312,17 +322,57 @@ glass-easel 并不会自行调用这个接口。应由其他模块调用这个
312
322
 
313
323
  **仅 Shadow Mode 有效。**
314
324
 
315
- ### `Element#setSlot(slot: string, inherit: boolean)`
325
+ ### `Element#setContainingSlot(slot: Element | undefined | null)`
316
326
 
317
- 设置节点的目标 slot ;若 `inherit` true ,则将节点设为 slot-inherit 节点。
327
+ 设置节点的目标 slot ;`undefined` 表示节点没有目标 slot;`null` 表示节点的目标 slot 为空 (即节点的 composedParent 为空)。
328
+
329
+ **仅 Shadow Mode 有效。**
330
+
331
+ ### `Element#reassignContainingSlot(oldSlot: Element | null, newSlot: Element | null)`
332
+
333
+ 替换节点的目标 slot;`null` 表示节点的目标 slot 为空 (即节点的 composedParent 为空)。
334
+
335
+ **仅 Shadow Mode 有效。**
336
+
337
+ ### `Element#spliceBeforeSlotNodes(before: number, deleteCount: number, list: Element)`
338
+
339
+ 更改当前节点的 slot 内容,删除从 `before` 开始的 `deleteCount` 个节点,并在这个位置插入 `list` 中包含的所有节点。
340
+
341
+ `list` 必然是片段节点,应被清空,但可能被再次使用。
342
+
343
+ 当前节点一定是一个 slot 节点。
344
+
345
+ **仅 Shadow Mode 有效。**
346
+
347
+ ### `Element#spliceAppendSlotNodes(list: Element)`
348
+
349
+ 追加当前节点的 slot 内容,在末尾插入 `list` 中包含的所有节点。
350
+
351
+ `list` 必然是片段节点,应被清空,但可能被再次使用。
352
+
353
+ 当前节点一定是一个 slot 节点。
354
+
355
+ **仅 Shadow Mode 有效。**
356
+
357
+ ### `Element#spliceRemoveSlotNodes(before: number, deleteCount: number)`
358
+
359
+ 更改当前节点的 slot 内容,删除从 `before` 开始的 `deleteCount` 个节点。
360
+
361
+ 当前节点一定是一个 slot 节点。
362
+
363
+ **仅 Shadow Mode 有效。**
364
+
365
+ ### `Element#setInheritSlots()`
366
+
367
+ 设置节点为 slot-inherit。
318
368
 
319
369
  对于 slot-inherit 节点,它的子节点在 composed tree 上并不视为子节点,而视为它之后的兄弟节点。这可以使得这些子节点拥有不同的目标 slot 。
320
370
 
321
- 节点仅在初始化阶段、还没有子节点时才会被设为 slot-inherit 节点;一旦节点被设为 slot-inherit 节点,就不会再被设为非 slot-inherit 节点。
371
+ 节点仅在初始化阶段、还没有子节点时才会被设为 slot-inherit 节点;
322
372
 
323
373
  **仅 Shadow Mode 有效。**
324
374
 
325
- ### `Element#setStyleScope(styleScope: number): void`
375
+ ### `Element#setStyleScope(styleScope: number, extraStyleScope: number | undefined, hostStyleScope?: number | undefined): void`
326
376
 
327
377
  设置节点的 scope 标识符。对于同一个节点,最多被设置一次。
328
378
 
@@ -330,13 +380,13 @@ glass-easel 并不会自行调用这个接口。应由其他模块调用这个
330
380
 
331
381
  在匹配样式规则时,如果使用除 class 以外的节点选择器(如标签名选择器、 ID 选择器)来匹配这个节点,则样式表的 scope 标识符必须为空或等于这个节点的 scope 标识符。
332
382
 
333
- **在 Shadow Mode 下** ,仅对普通节点和非虚组件节点调用; **在 Composed Mode 下** ,仅对普通节点调用。
383
+ **仅 Composed Mode 有效**
334
384
 
335
- ### `Element#replaceStyleSheetInlineStyle(styleText: string): void`
385
+ ### `Element#setStyle(styleText: string): void`
336
386
 
337
387
  设置节点 style 。
338
388
 
339
- **在 Shadow Mode 下** ,仅对普通节点和非虚组件节点调用; **在 Composed Mode 下** ,仅对普通节点调用。
389
+ 不会对文本节点调用。
340
390
 
341
391
  ### `Element#addClass(elementClass: string, styleScope?: number): void`
342
392
 
@@ -346,7 +396,9 @@ glass-easel 并不会自行调用这个接口。应由其他模块调用这个
346
396
 
347
397
  在匹配样式规则时,如果使用这个 class 来匹配这个节点,则样式表的 scope 标识符必须为空或等于这个 `styleScope` 。
348
398
 
349
- **在 Shadow Mode 下** ,仅对普通节点和非虚组件节点调用; **在 Composed Mode 下** ,仅对普通节点调用。
399
+ 不会对文本节点调用。
400
+
401
+ **在 Shadow Mode 下** ,不会传递 styleScope;
350
402
 
351
403
  ### `Element#removeClass(elementClass: string, styleScope?: number): void`
352
404
 
@@ -354,25 +406,43 @@ glass-easel 并不会自行调用这个接口。应由其他模块调用这个
354
406
 
355
407
  如果 styleScope 不为非负整数,则视为空。
356
408
 
357
- **在 Shadow Mode 下** ,仅对普通节点和非虚组件节点调用; **在 Composed Mode 下** ,仅对普通节点调用。
409
+ 不会对文本节点调用。
410
+
411
+ **在 Shadow Mode 下** ,不会传递 styleScope;
358
412
 
359
413
  ### `Element#clearClasses(): void`
360
414
 
361
415
  移除所有 class 。
362
416
 
363
- **在 Shadow Mode 下** ,仅对普通节点和非虚组件节点调用; **在 Composed Mode 下** ,仅对普通节点调用。
417
+ 不会对文本节点调用。
364
418
 
365
- ### `Element#setAttribute(name: string, value: any): void`
419
+ ### `Element#setClassAlias(className: string, target: string): void`
420
+
421
+ 更新一个节点的 class 别名。
422
+
423
+ 不会对文本节点调用。
424
+
425
+ **仅 Shadow Mode 有效。**
366
426
 
367
- 设置节点的一个属性。
427
+ ### `Element#setAttribute(name: string, value: unknown): void`
368
428
 
369
- 仅对普通节点调用。
429
+ 设置节点的一个属性。value 可能为任何类型。
430
+
431
+ 不会对文本节点调用。
370
432
 
371
433
  ### `Element#removeAttribute(name: string): void`
372
434
 
373
435
  移除节点的一个属性。
374
436
 
375
- 仅对普通节点调用。
437
+ 不会对文本节点调用。
438
+
439
+ ### `Element#setDataset(name: string, value: unknown): void`
440
+
441
+ 设置节点的一个 dataset 属性。value 可能为任何类型。
442
+
443
+ 不会对文本节点调用。
444
+
445
+ **仅 Shadow Mode 有效。**
376
446
 
377
447
  ### `Element#setText(content: string): void`
378
448
 
@@ -380,7 +450,25 @@ glass-easel 并不会自行调用这个接口。应由其他模块调用这个
380
450
 
381
451
  仅对文本节点调用。
382
452
 
383
- ### `async Element#getContext(): any`
453
+ ## `Element#setModelBindingStat(attributeName: string, listener: ((newValue: unknown) => void) | null): void`
454
+
455
+ 同步一个节点上的数据绑定设置。`attributeName` 表示字段名;`listener` 表示数据绑定更新回调。
456
+
457
+ 仅对普通节点调用
458
+
459
+ ## `Element#setListenerStats(type: string, capture: boolean, mutLevel: MutLevel): void`
460
+
461
+ 同步一个节点上的事件响应设置。`type` 表示事件名;`capture` 表示事件响应是否是捕获节点;`mutLevel` 表示事件响应类型。
462
+
463
+ 若 `mutLevel` 为 `MutLevel.None`,则表示为普通响应。
464
+
465
+ 若 `mutLevel` 为 `MutLevel.Mut`,则表示为互斥响应;该轮事件冒泡中,若已经执行过一个互斥响应,则之后的互斥响应不会被执行。
466
+
467
+ 若 `mutLevel` 为 `MutLevel.Final`,则表示为最终响应;事件冒泡会被停止,且阻止事件默认行为。
468
+
469
+ 不会对文本节点调用。
470
+
471
+ ### `async Element#getContext(): unknown`
384
472
 
385
473
  获得与对应节点关联的上下文对象。
386
474
 
@@ -427,12 +515,16 @@ type glass-easelCSSRule = {
427
515
 
428
516
  如果节点没有布局信息,返回全 0 值。
429
517
 
518
+ **这只是一个建议性质的接口。** glass-easel 并不会自行调用这个接口,但其他相关模块很可能调用。
519
+
430
520
  ### `Element#createIntersectionObserver(...)`
431
521
 
432
522
  创建一个 IntersectionObserver 用于监听相交状态变化。
433
523
 
434
524
  监听器必然在开始监听时触发一次,用于返回初始的相交状态信息。
435
525
 
526
+ **这只是一个建议性质的接口。** glass-easel 并不会自行调用这个接口,但其他相关模块很可能调用。
527
+
436
528
  ### `async Element#getScrollPosition(): { scrollLeft: number, scrollTop: number, scrollWidth: number, scrollHeight: number }`
437
529
 
438
530
  获得节点的内部滚动位置。
@@ -447,28 +539,19 @@ type glass-easelCSSRule = {
447
539
 
448
540
  **这只是一个建议性质的接口。** glass-easel 并不会自行调用这个接口,但其他相关模块很可能调用。
449
541
 
450
- ### `Element#setEventDefaultPrevented(type: string, enabled: boolean)`
451
-
452
- 将一个节点上的某个事件响应设置(或取消设置)为禁止默认行为的。
453
-
454
- 节点上被绑定某个事件的监听器时,无论 `enabled` 值如何,这个调用必然被触发。因此可用于判断该节点是否曾绑定有该事件的监听器。
455
-
456
-
457
542
  ## ShadowRootContext
458
543
 
459
544
  代表一个 shadow tree 环境。
460
545
 
461
546
  **这个对象仅 Shadow Mode 有效。**
462
547
 
463
- ### `ShadowRootContext#getRootNode(): Element`
464
-
465
- 获得根节点。
548
+ ### `ShadowRootContext#createElement(logicalName: string, stylingName: string): Element`
466
549
 
467
- **仅 Shadow Mode 有效。**
550
+ 创建一个普通节点。
468
551
 
469
- ### `ShadowRootContext#createElement(tagName: string): Element`
552
+ `logicalName` 为节点自身定义的名字。
470
553
 
471
- 创建一个普通节点。
554
+ `stylingName` 为被使用时设置的别名。
472
555
 
473
556
  **仅 Shadow Mode 有效。**
474
557
 
@@ -478,19 +561,25 @@ type glass-easelCSSRule = {
478
561
 
479
562
  **仅 Shadow Mode 有效。**
480
563
 
481
- ### `ShadowRootContext#createComponent(tagName: string, isVirtual: boolean): Element`
564
+ ### `ShadowRootContext#createComponent(tagName: string, external: boolean, virtualHost: boolean, styleScope: number, extraStyleScope: number | null, externalClasses: string[] | undefined): Element`
482
565
 
483
- 创建一个组件节点。可以指定为虚或非虚。虚组件节点的 tagName 无效。
566
+ 创建一个组件节点。
484
567
 
485
- **仅 Shadow Mode 有效。**
568
+ `tagName` 表示组件的名称 (对应 stylingName)。
569
+
570
+ `external` 表示组件是否是一个外部组件节点。外部组件是一个已经预建好的后端节点树,与其他部分直接拼接在一起。
571
+
572
+ `virtualHost` 表示组件是否是一个虚拟组件。虚拟组件是一个最外层是虚拟节点的组件。
573
+
574
+ `styleScope` 表示组件的 scope 标识符。
486
575
 
487
- ### `createExternalComponent(shadowRoot: Element, slot: Element): Element`
576
+ `extraStyleScope` 表示组件的额外 scope 标识符。
488
577
 
489
- 创建一个外部组件节点。外部组件是一个已经预建好的后端节点树,与其他部分直接拼接在一起。
578
+ `externalClasses` 表示节点的 external class 列表。
490
579
 
491
580
  **仅 Shadow Mode 有效。**
492
581
 
493
- ### `ShadowRootContext#createVirtualNode(): Element`
582
+ ### `ShadowRootContext#createVirtualNode(virtualName: string): Element`
494
583
 
495
584
  创建一个虚节点。
496
585
 
@@ -501,11 +590,12 @@ type glass-easelCSSRule = {
501
590
  表示以 Shadow Mode 还是 Composed Mode 运行。
502
591
 
503
592
  * `ContextMode.Composed = 1` 运行于 Composed Mode ;
504
- * `ConetxtMode.Shadow = 2` 运行于 Shadow Mode 。
593
+ * `ContextMode.Shadow = 2` 运行于 Shadow Mode 。
505
594
 
506
- ## enum EventBubbleStatus
595
+ ## enum MutLevel
507
596
 
508
- 表示冒泡状态。
597
+ 表示事件响应设置。
509
598
 
510
- * `EventBubbleStatus.Normal = 0` 无特殊操作;
511
- * `EventBubbleStatus.NoDefault = 1` 禁用默认操作。
599
+ * `MutLevel.None = 0` 普通响应;
600
+ * `MutLevel.Mut = 1` 互斥响应,一轮冒泡只执行第一个互斥响应;
601
+ * `MutLevel.Final = 2` 响应后终止冒泡且禁用默认操作;
@@ -1,9 +1,12 @@
1
1
  module.exports = {
2
2
  preset: 'ts-jest/presets/js-with-babel',
3
- globals: {
4
- 'ts-jest': {
5
- tsconfig: 'tsconfig.json',
6
- },
3
+ transform: {
4
+ '^.+\\.ts$': [
5
+ 'ts-jest',
6
+ {
7
+ tsconfig: 'tsconfig.json',
8
+ },
9
+ ],
7
10
  },
8
11
  roots: ['tests'],
9
12
  testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)', '!**/types/**'],
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "glass-easel",
3
3
  "description": "The core module of the glass-easel project",
4
- "version": "0.2.0",
4
+ "version": "0.3.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/wechat-miniprogram/glass-easel.git"
@@ -13,16 +13,18 @@
13
13
  "url": "https://github.com/wechat-miniprogram/glass-easel/issues"
14
14
  },
15
15
  "homepage": "https://github.com/wechat-miniprogram/glass-easel",
16
- "main": "dist/index.js",
16
+ "main": "dist/glass_easel.all.js",
17
+ "module": "dist/glass_easel.all.es.js",
18
+ "types": "dist/glass_easel.d.ts",
17
19
  "scripts": {
18
20
  "doc": "typedoc src/index.ts --excludePrivate --excludeProtected --excludeInternal",
19
- "build": "webpack --config webpack.config.js",
20
- "dev": "webpack --config webpack.config.js --watch",
21
+ "build": "rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript",
22
+ "dev": "GLASS_EASEL_ARGS=--dev npm run build",
21
23
  "lint": "eslint --ext .js,.ts src",
22
24
  "test": "jest -c jest.config.js",
23
25
  "coverage": "jest -c jest.config.js --collect-coverage"
24
26
  },
25
27
  "devDependencies": {
26
- "glass-easel-template-compiler": "*"
28
+ "glass-easel-template-compiler": "0.3.0"
27
29
  }
28
30
  }
@@ -0,0 +1,101 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+ import nodeResolve from '@rollup/plugin-node-resolve'
3
+ import replace from '@rollup/plugin-replace'
4
+ import terser from '@rollup/plugin-terser'
5
+ import typescript from '@rollup/plugin-typescript'
6
+ import type { ModuleFormat, RollupOptions } from 'rollup'
7
+ import dts from 'rollup-plugin-dts'
8
+
9
+ const jobs: string[] = []
10
+ let minimize = true
11
+ let sourcemap = true
12
+ let dev = false
13
+ const args = (process.env as { GLASS_EASEL_ARGS?: string }).GLASS_EASEL_ARGS || ''
14
+ args.split(' ').forEach((arg) => {
15
+ if (!arg) return
16
+ if (arg[0] === '-') {
17
+ if (arg === '--no-minimize') minimize = false
18
+ else if (arg === '--dev') {
19
+ dev = true
20
+ minimize = false
21
+ sourcemap = false
22
+ }
23
+ } else {
24
+ jobs.push(arg)
25
+ }
26
+ })
27
+
28
+ const dtsCompilation: RollupOptions = {
29
+ input: './src/index.ts',
30
+ output: { file: `dist/glass_easel.d.ts`, format: 'es', name: 'glassEasel' },
31
+ plugins: [
32
+ nodeResolve({
33
+ extensions: ['.ts', 'js'],
34
+ }),
35
+ dts(),
36
+ ],
37
+ }
38
+
39
+ const genConfig = (
40
+ type: 'dynamic' | 'shadow' | 'composed' | 'domlike',
41
+ ext: string,
42
+ format: ModuleFormat,
43
+ ): RollupOptions => ({
44
+ input: './src/index.ts',
45
+ output: {
46
+ file: `dist/glass_easel.${ext ? `${ext}.` : ''}js`,
47
+ sourcemap,
48
+ format,
49
+ name: 'glassEasel',
50
+ },
51
+ plugins: [
52
+ replace({
53
+ values: {
54
+ 'ENV.DEV': JSON.stringify(dev),
55
+ 'BM.DYNAMIC': JSON.stringify(type === 'dynamic'),
56
+ 'BM.SHADOW': JSON.stringify(type === 'shadow'),
57
+ 'BM.COMPOSED': JSON.stringify(type === 'composed'),
58
+ 'BM.DOMLIKE': JSON.stringify(type === 'domlike'),
59
+ },
60
+ preventAssignment: true,
61
+ }),
62
+ nodeResolve({
63
+ extensions: ['.ts', 'js'],
64
+ }),
65
+ typescript({
66
+ sourceMap: sourcemap,
67
+ }),
68
+ minimize
69
+ ? terser({
70
+ sourceMap: sourcemap,
71
+ })
72
+ : null,
73
+ ],
74
+ })
75
+
76
+ const config: RollupOptions[] = [dtsCompilation]
77
+
78
+ if (jobs.length) {
79
+ jobs.forEach((name) => {
80
+ const map = {
81
+ all: () => genConfig('dynamic', 'all', 'cjs'),
82
+ 'all-es': () => genConfig('dynamic', 'all.es', 'es'),
83
+ 'all-global': () => genConfig('dynamic', 'all.global', 'iife'),
84
+ shadow: () => genConfig('shadow', 'shadow', 'cjs'),
85
+ 'shadow-es': () => genConfig('shadow', 'shadow.es', 'es'),
86
+ 'shadow-global': () => genConfig('shadow', 'shadow.global', 'iife'),
87
+ composed: () => genConfig('composed', 'composed', 'cjs'),
88
+ 'composed-es': () => genConfig('composed', 'composed.es', 'es'),
89
+ 'composed-global': () => genConfig('composed', 'composed.global', 'iife'),
90
+ domlike: () => genConfig('domlike', 'domlike', 'cjs'),
91
+ 'domlike-es': () => genConfig('domlike', 'domlike.es', 'es'),
92
+ 'domlike-global': () => genConfig('domlike', 'domlike.global', 'iife'),
93
+ } as Record<string, () => RollupOptions>
94
+ if (!map[name]) throw new Error(`Unknown job: ${name}`)
95
+ config.push(map[name]!())
96
+ })
97
+ } else {
98
+ config.push(genConfig('dynamic', 'all', 'cjs'), genConfig('dynamic', 'all.es', 'es'))
99
+ }
100
+
101
+ export default config