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
@@ -1,4 +1,4 @@
1
- import { tmpl, domBackend } from '../base/env'
1
+ import { tmpl, domBackend, composedBackend, shadowBackend } from '../base/env'
2
2
  import * as glassEasel from '../../src'
3
3
 
4
4
  const domHtml = (elem: glassEasel.Element): string => {
@@ -6,222 +6,228 @@ const domHtml = (elem: glassEasel.Element): string => {
6
6
  return domElem.innerHTML
7
7
  }
8
8
 
9
- describe('binding map update enabled', () => {
10
- test('multi-target update', () => {
11
- const def = glassEasel.registerElement({
12
- template: tmpl(`
9
+ const testCases = (testBackend: glassEasel.GeneralBackendContext) => {
10
+ describe('binding map update enabled', () => {
11
+ test('multi-target update', () => {
12
+ const def = glassEasel.registerElement({
13
+ template: tmpl(`
13
14
  <div class="class-a {{c}}">
14
15
  <span id="b" data-a="{{c}}">{{c}}</span>
15
16
  </div>
16
17
  `),
17
- data: {
18
- c: 'abc',
19
- },
18
+ data: {
19
+ c: 'abc',
20
+ },
21
+ })
22
+ const elem = glassEasel.Component.createWithContext('root', def.general(), testBackend)
23
+ const child = elem.getShadowRoot()!.getElementById('b')!
24
+ expect(domHtml(elem)).toBe('<div class="class-a abc"><span>abc</span></div>')
25
+ expect(child.dataset.a).toBe('abc')
26
+ elem.setData({ c: 'def' })
27
+ expect(domHtml(elem)).toBe('<div class="class-a def"><span>def</span></div>')
28
+ expect(child.dataset.a).toBe('def')
20
29
  })
21
- const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend)
22
- const child = elem.getShadowRoot()!.getElementById('b')!
23
- expect(domHtml(elem)).toBe('<div class="class-a abc"><span>abc</span></div>')
24
- expect(child.dataset.a).toBe('abc')
25
- elem.setData({ c: 'def' })
26
- expect(domHtml(elem)).toBe('<div class="class-a def"><span>def</span></div>')
27
- expect(child.dataset.a).toBe('def')
28
- })
29
30
 
30
- test('model data path update', () => {
31
- const subComp = glassEasel.registerElement({
32
- template: tmpl(`
31
+ test('model data path update', () => {
32
+ const subComp = glassEasel.registerElement({
33
+ template: tmpl(`
33
34
  <div>{{propA}}</div>
34
35
  <slot />
35
36
  `),
36
- properties: {
37
- propA: Number,
38
- },
39
- })
40
- const def = glassEasel.registerElement({
41
- using: {
42
- comp: subComp.general(),
43
- },
44
- template: tmpl(`
37
+ properties: {
38
+ propA: Number,
39
+ },
40
+ })
41
+ const def = glassEasel.registerElement({
42
+ using: {
43
+ comp: subComp.general(),
44
+ },
45
+ template: tmpl(`
45
46
  <comp id="comp" model:prop-a="{{ list[index].a }}">{{ ['A', 'B', 'C'][index + 1] }}</comp>
46
47
  `),
47
- data: {
48
- index: 0,
49
- list: [
50
- {
51
- a: 123,
52
- },
53
- {
54
- a: 456,
55
- },
56
- ],
57
- },
48
+ data: {
49
+ index: 0,
50
+ list: [
51
+ {
52
+ a: 123,
53
+ },
54
+ {
55
+ a: 456,
56
+ },
57
+ ],
58
+ },
59
+ })
60
+ const elem = glassEasel.Component.createWithContext('root', def, testBackend)
61
+ const comp = elem.getShadowRoot()!.getElementById('comp') as glassEasel.GeneralComponent
62
+ expect(domHtml(elem)).toBe('<comp><div>123</div>B</comp>')
63
+ comp.setData({ propA: 789 })
64
+ expect(domHtml(elem)).toBe('<comp><div>789</div>B</comp>')
65
+ expect(elem.data.list).toEqual([{ a: 789 }, { a: 456 }])
66
+ elem.setData({ index: 1 })
67
+ expect(domHtml(elem)).toBe('<comp><div>456</div>C</comp>')
68
+ expect(elem.data.list).toEqual([{ a: 789 }, { a: 456 }])
69
+ comp.setData({ propA: 123 })
70
+ expect(domHtml(elem)).toBe('<comp><div>123</div>C</comp>')
71
+ expect(elem.data.list).toEqual([{ a: 789 }, { a: 123 }])
58
72
  })
59
- const elem = glassEasel.Component.createWithContext('root', def, domBackend)
60
- const comp = elem.getShadowRoot()!.getElementById('comp') as glassEasel.GeneralComponent
61
- expect(domHtml(elem)).toBe('<comp><div>123</div>B</comp>')
62
- comp.setData({ propA: 789 })
63
- expect(domHtml(elem)).toBe('<comp><div>789</div>B</comp>')
64
- expect(elem.data.list).toEqual([{ a: 789 }, { a: 456 }])
65
- elem.setData({ index: 1 })
66
- expect(domHtml(elem)).toBe('<comp><div>456</div>C</comp>')
67
- expect(elem.data.list).toEqual([{ a: 789 }, { a: 456 }])
68
- comp.setData({ propA: 123 })
69
- expect(domHtml(elem)).toBe('<comp><div>123</div>C</comp>')
70
- expect(elem.data.list).toEqual([{ a: 789 }, { a: 123 }])
71
73
  })
72
- })
73
74
 
74
- describe('binding map update forced', () => {
75
- test('mixed usage in multiple components', () => {
76
- const subComp = glassEasel.registerElement({
77
- properties: {
78
- content: String,
79
- propA: Number,
80
- },
81
- template: tmpl(`
82
- <div>{{content}}</div>
83
- `),
75
+ describe('binding map update forced', () => {
76
+ test('mixed usage in multiple components', () => {
77
+ const subComp = glassEasel.registerElement({
78
+ properties: {
79
+ content: String,
80
+ propA: Number,
81
+ },
82
+ template: tmpl(`
83
+ <div>{{content}}</div>
84
+ `),
85
+ })
86
+ const def = glassEasel.registerElement({
87
+ using: {
88
+ 'sub-comp': subComp.general(),
89
+ },
90
+ template: tmpl(
91
+ `
92
+ <sub-comp content="{{c}}" model:prop-a="{{a}}" />
93
+ `,
94
+ { updateMode: 'bindingMap' },
95
+ ),
96
+ data: {
97
+ a: 123,
98
+ c: 'abc',
99
+ },
100
+ })
101
+ const elem = glassEasel.Component.createWithContext('root', def, testBackend)
102
+ const child = (
103
+ elem.getShadowRoot()!.childNodes[0] as glassEasel.GeneralComponent
104
+ ).asInstanceOf(subComp)!
105
+ expect(domHtml(elem)).toBe('<sub-comp><div>abc</div></sub-comp>')
106
+ elem.setData({ c: 'def' })
107
+ expect(domHtml(elem)).toBe('<sub-comp><div>def</div></sub-comp>')
108
+ child.setData({ propA: 456 })
109
+ expect(elem.data.a).toBe(456)
110
+ child.setData({ propA: 789 })
111
+ expect(elem.data.a).toBe(789)
84
112
  })
85
- const def = glassEasel.registerElement({
86
- using: {
87
- 'sub-comp': subComp.general(),
88
- },
89
- template: tmpl(
90
- `
91
- <sub-comp content="{{c}}" model:prop-a="{{a}}" />
92
- `,
93
- { updateMode: 'bindingMap' },
94
- ),
95
- data: {
96
- a: 123,
97
- c: 'abc',
98
- },
99
- })
100
- const elem = glassEasel.Component.createWithContext('root', def, domBackend)
101
- const child = (elem.getShadowRoot()!.childNodes[0] as glassEasel.GeneralComponent).asInstanceOf(
102
- subComp,
103
- )!
104
- expect(domHtml(elem)).toBe('<sub-comp><div>abc</div></sub-comp>')
105
- elem.setData({ c: 'def' })
106
- expect(domHtml(elem)).toBe('<sub-comp><div>def</div></sub-comp>')
107
- child.setData({ propA: 456 })
108
- expect(elem.data.a).toBe(456)
109
- child.setData({ propA: 789 })
110
- expect(elem.data.a).toBe(789)
111
- })
112
113
 
113
- test('ignore fields with usage in if position', () => {
114
- const def = glassEasel.registerElement({
115
- template: tmpl(
116
- `
117
- <div>{{a}}</div>
118
- <div>{{b}}</div>
119
- <div>{{c}}</div>
120
- <div wx:if="{{b}}">{{c}}</div>
121
- `,
122
- { updateMode: 'bindingMap' },
123
- ),
124
- data: {
125
- a: 1,
126
- b: 2,
127
- c: 3,
128
- },
114
+ test('ignore fields with usage in if position', () => {
115
+ const def = glassEasel.registerElement({
116
+ template: tmpl(
117
+ `
118
+ <div>{{a}}</div>
119
+ <div>{{b}}</div>
120
+ <div>{{c}}</div>
121
+ <div wx:if="{{b}}">{{c}}</div>
122
+ `,
123
+ { updateMode: 'bindingMap' },
124
+ ),
125
+ data: {
126
+ a: 1,
127
+ b: 2,
128
+ c: 3,
129
+ },
130
+ })
131
+ const elem = glassEasel.Component.createWithContext('root', def.general(), testBackend)
132
+ expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div>')
133
+ elem.setData({ b: 20 })
134
+ expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div>')
135
+ elem.setData({ c: 30 })
136
+ expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div>')
137
+ elem.setData({ a: 10 })
138
+ expect(domHtml(elem)).toBe('<div>10</div><div>2</div><div>3</div><div>3</div>')
139
+ elem.setData({ a: 100, b: 200 })
140
+ expect(domHtml(elem)).toBe('<div>100</div><div>2</div><div>3</div><div>3</div>')
129
141
  })
130
- const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend)
131
- expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div>')
132
- elem.setData({ b: 20 })
133
- expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div>')
134
- elem.setData({ c: 30 })
135
- expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div>')
136
- elem.setData({ a: 10 })
137
- expect(domHtml(elem)).toBe('<div>10</div><div>2</div><div>3</div><div>3</div>')
138
- elem.setData({ a: 100, b: 200 })
139
- expect(domHtml(elem)).toBe('<div>100</div><div>2</div><div>3</div><div>3</div>')
140
- })
141
142
 
142
- test('ignore fields with usage in for position', () => {
143
- const def = glassEasel.registerElement({
144
- template: tmpl(
145
- `
146
- <div>{{a}}</div>
147
- <div>{{b}}</div>
148
- <div>{{c}}</div>
149
- <div wx:for="{{[1, b]}}">{{c}}</div>
150
- `,
151
- { updateMode: 'bindingMap' },
152
- ),
153
- data: {
154
- a: 1,
155
- b: 2,
156
- c: 3,
157
- },
143
+ test('ignore fields with usage in for position', () => {
144
+ const def = glassEasel.registerElement({
145
+ template: tmpl(
146
+ `
147
+ <div>{{a}}</div>
148
+ <div>{{b}}</div>
149
+ <div>{{c}}</div>
150
+ <div wx:for="{{[1, b]}}">{{c}}</div>
151
+ `,
152
+ { updateMode: 'bindingMap' },
153
+ ),
154
+ data: {
155
+ a: 1,
156
+ b: 2,
157
+ c: 3,
158
+ },
159
+ })
160
+ const elem = glassEasel.Component.createWithContext('root', def.general(), testBackend)
161
+ expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div><div>3</div>')
162
+ elem.setData({ b: 20 })
163
+ expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div><div>3</div>')
164
+ elem.setData({ c: 30 })
165
+ expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div><div>3</div>')
166
+ elem.setData({ a: 10 })
167
+ expect(domHtml(elem)).toBe('<div>10</div><div>2</div><div>3</div><div>3</div><div>3</div>')
168
+ elem.setData({ a: 100, b: 200 })
169
+ expect(domHtml(elem)).toBe('<div>100</div><div>2</div><div>3</div><div>3</div><div>3</div>')
158
170
  })
159
- const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend)
160
- expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div><div>3</div>')
161
- elem.setData({ b: 20 })
162
- expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div><div>3</div>')
163
- elem.setData({ c: 30 })
164
- expect(domHtml(elem)).toBe('<div>1</div><div>2</div><div>3</div><div>3</div><div>3</div>')
165
- elem.setData({ a: 10 })
166
- expect(domHtml(elem)).toBe('<div>10</div><div>2</div><div>3</div><div>3</div><div>3</div>')
167
- elem.setData({ a: 100, b: 200 })
168
- expect(domHtml(elem)).toBe('<div>100</div><div>2</div><div>3</div><div>3</div><div>3</div>')
169
- })
170
171
 
171
- test('ignore fields with usage in template position', () => {
172
- const def = glassEasel.registerElement({
173
- template: tmpl(
174
- `
175
- <template name="child">
172
+ test('ignore fields with usage in template position', () => {
173
+ const def = glassEasel.registerElement({
174
+ template: tmpl(
175
+ `
176
+ <template name="child">
177
+ <div>{{c}}</div>
178
+ </template>
179
+ <div>{{a}}</div>
180
+ <div>{{b}}</div>
176
181
  <div>{{c}}</div>
177
- </template>
178
- <div>{{a}}</div>
179
- <div>{{b}}</div>
180
- <div>{{c}}</div>
181
- <template is="{{b}}" data="{{ {c} }}"></template>
182
- `,
183
- { updateMode: 'bindingMap' },
184
- ),
185
- data: {
186
- a: 1,
187
- b: 'child',
188
- c: 3,
189
- },
182
+ <template is="{{b}}" data="{{ {c} }}"></template>
183
+ `,
184
+ { updateMode: 'bindingMap' },
185
+ ),
186
+ data: {
187
+ a: 1,
188
+ b: 'child',
189
+ c: 3,
190
+ },
191
+ })
192
+ const elem = glassEasel.Component.createWithContext('root', def.general(), testBackend)
193
+ expect(domHtml(elem)).toBe('<div>1</div><div>child</div><div>3</div><div>3</div>')
194
+ elem.setData({ b: 20 })
195
+ expect(domHtml(elem)).toBe('<div>1</div><div>child</div><div>3</div><div>3</div>')
196
+ elem.setData({ c: 30 })
197
+ expect(domHtml(elem)).toBe('<div>1</div><div>child</div><div>3</div><div>3</div>')
198
+ elem.setData({ a: 10 })
199
+ expect(domHtml(elem)).toBe('<div>10</div><div>child</div><div>3</div><div>3</div>')
200
+ elem.setData({ a: 100, b: 200 })
201
+ expect(domHtml(elem)).toBe('<div>100</div><div>child</div><div>3</div><div>3</div>')
190
202
  })
191
- const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend)
192
- expect(domHtml(elem)).toBe('<div>1</div><div>child</div><div>3</div><div>3</div>')
193
- elem.setData({ b: 20 })
194
- expect(domHtml(elem)).toBe('<div>1</div><div>child</div><div>3</div><div>3</div>')
195
- elem.setData({ c: 30 })
196
- expect(domHtml(elem)).toBe('<div>1</div><div>child</div><div>3</div><div>3</div>')
197
- elem.setData({ a: 10 })
198
- expect(domHtml(elem)).toBe('<div>10</div><div>child</div><div>3</div><div>3</div>')
199
- elem.setData({ a: 100, b: 200 })
200
- expect(domHtml(elem)).toBe('<div>100</div><div>child</div><div>3</div><div>3</div>')
201
- })
202
203
 
203
- test('ignore fields with usage in slot position', () => {
204
- const def = glassEasel.registerElement({
205
- template: tmpl(
206
- `
207
- <div>{{a}}</div>
208
- <div>{{b}}</div>
209
- <slot name="{{b}}"></slot>
210
- `,
211
- { updateMode: 'bindingMap' },
212
- ),
213
- data: {
214
- a: 1,
215
- b: 2,
216
- },
204
+ test('ignore fields with usage in slot position', () => {
205
+ const def = glassEasel.registerElement({
206
+ template: tmpl(
207
+ `
208
+ <div>{{a}}</div>
209
+ <div>{{b}}</div>
210
+ <slot name="{{b}}"></slot>
211
+ `,
212
+ { updateMode: 'bindingMap' },
213
+ ),
214
+ data: {
215
+ a: 1,
216
+ b: 2,
217
+ },
218
+ })
219
+ const elem = glassEasel.Component.createWithContext('root', def.general(), testBackend)
220
+ expect(domHtml(elem)).toBe('<div>1</div><div>2</div>')
221
+ elem.setData({ b: 20 })
222
+ expect(domHtml(elem)).toBe('<div>1</div><div>2</div>')
223
+ elem.setData({ a: 10 })
224
+ expect(domHtml(elem)).toBe('<div>10</div><div>2</div>')
225
+ elem.setData({ a: 100, b: 200 })
226
+ expect(domHtml(elem)).toBe('<div>100</div><div>2</div>')
217
227
  })
218
- const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend)
219
- expect(domHtml(elem)).toBe('<div>1</div><div>2</div>')
220
- elem.setData({ b: 20 })
221
- expect(domHtml(elem)).toBe('<div>1</div><div>2</div>')
222
- elem.setData({ a: 10 })
223
- expect(domHtml(elem)).toBe('<div>10</div><div>2</div>')
224
- elem.setData({ a: 100, b: 200 })
225
- expect(domHtml(elem)).toBe('<div>100</div><div>2</div>')
226
228
  })
227
- })
229
+ }
230
+
231
+ describe('binding map (DOM backend)', () => testCases(domBackend))
232
+ describe('binding map (shadow backend)', () => testCases(shadowBackend))
233
+ describe('binding map (composed backend)', () => testCases(composedBackend))