glass-easel 0.1.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 (237) hide show
  1. package/README.md +40 -0
  2. package/dist/glass_easel.all.d.ts +1 -0
  3. package/dist/glass_easel.all.js +2 -0
  4. package/dist/glass_easel.all.js.map +1 -0
  5. package/dist/glass_easel.domlike.global.d.ts +1 -0
  6. package/dist/glass_easel.domlike.global.js +2 -0
  7. package/dist/glass_easel.domlike.global.js.map +1 -0
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.js +1 -0
  10. package/dist/types/src/backend/backend_protocol.d.ts +119 -0
  11. package/dist/types/src/backend/backend_protocol.d.ts.map +1 -0
  12. package/dist/types/src/backend/composed_backend_protocol.d.ts +90 -0
  13. package/dist/types/src/backend/composed_backend_protocol.d.ts.map +1 -0
  14. package/dist/types/src/backend/domlike_backend_protocol.d.ts +76 -0
  15. package/dist/types/src/backend/domlike_backend_protocol.d.ts.map +1 -0
  16. package/dist/types/src/backend/mode.d.ts +46 -0
  17. package/dist/types/src/backend/mode.d.ts.map +1 -0
  18. package/dist/types/src/backend/suggested_backend_protocol.d.ts +30 -0
  19. package/dist/types/src/backend/suggested_backend_protocol.d.ts.map +1 -0
  20. package/dist/types/src/behavior.d.ts +428 -0
  21. package/dist/types/src/behavior.d.ts.map +1 -0
  22. package/dist/types/src/class_list.d.ts +79 -0
  23. package/dist/types/src/class_list.d.ts.map +1 -0
  24. package/dist/types/src/component.d.ts +291 -0
  25. package/dist/types/src/component.d.ts.map +1 -0
  26. package/dist/types/src/component_params.d.ts +239 -0
  27. package/dist/types/src/component_params.d.ts.map +1 -0
  28. package/dist/types/src/component_space.d.ts +164 -0
  29. package/dist/types/src/component_space.d.ts.map +1 -0
  30. package/dist/types/src/data_path.d.ts +5 -0
  31. package/dist/types/src/data_path.d.ts.map +1 -0
  32. package/dist/types/src/data_proxy.d.ts +107 -0
  33. package/dist/types/src/data_proxy.d.ts.map +1 -0
  34. package/dist/types/src/data_utils.d.ts +3 -0
  35. package/dist/types/src/data_utils.d.ts.map +1 -0
  36. package/dist/types/src/element.d.ts +275 -0
  37. package/dist/types/src/element.d.ts.map +1 -0
  38. package/dist/types/src/element_iterator.d.ts +43 -0
  39. package/dist/types/src/element_iterator.d.ts.map +1 -0
  40. package/dist/types/src/event.d.ts +104 -0
  41. package/dist/types/src/event.d.ts.map +1 -0
  42. package/dist/types/src/external_shadow_tree.d.ts +20 -0
  43. package/dist/types/src/external_shadow_tree.d.ts.map +1 -0
  44. package/dist/types/src/func_arr.d.ts +39 -0
  45. package/dist/types/src/func_arr.d.ts.map +1 -0
  46. package/dist/types/src/global_options.d.ts +111 -0
  47. package/dist/types/src/global_options.d.ts.map +1 -0
  48. package/dist/types/src/index.d.ts +43 -0
  49. package/dist/types/src/index.d.ts.map +1 -0
  50. package/dist/types/src/mutation_observer.d.ts +79 -0
  51. package/dist/types/src/mutation_observer.d.ts.map +1 -0
  52. package/dist/types/src/native_node.d.ts +8 -0
  53. package/dist/types/src/native_node.d.ts.map +1 -0
  54. package/dist/types/src/node.d.ts +49 -0
  55. package/dist/types/src/node.d.ts.map +1 -0
  56. package/dist/types/src/relation.d.ts +47 -0
  57. package/dist/types/src/relation.d.ts.map +1 -0
  58. package/dist/types/src/render.d.ts +3 -0
  59. package/dist/types/src/render.d.ts.map +1 -0
  60. package/dist/types/src/selector.d.ts +32 -0
  61. package/dist/types/src/selector.d.ts.map +1 -0
  62. package/dist/types/src/shadow_root.d.ts +136 -0
  63. package/dist/types/src/shadow_root.d.ts.map +1 -0
  64. package/dist/types/src/template_engine.d.ts +18 -0
  65. package/dist/types/src/template_engine.d.ts.map +1 -0
  66. package/dist/types/src/text_node.d.ts +32 -0
  67. package/dist/types/src/text_node.d.ts.map +1 -0
  68. package/dist/types/src/tmpl/index.d.ts +18 -0
  69. package/dist/types/src/tmpl/index.d.ts.map +1 -0
  70. package/dist/types/src/tmpl/native_rendering.d.ts +45 -0
  71. package/dist/types/src/tmpl/native_rendering.d.ts.map +1 -0
  72. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts +80 -0
  73. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts.map +1 -0
  74. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts +50 -0
  75. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts.map +1 -0
  76. package/dist/types/src/tmpl/range_list_diff.d.ts +19 -0
  77. package/dist/types/src/tmpl/range_list_diff.d.ts.map +1 -0
  78. package/dist/types/src/trait_behaviors.d.ts +38 -0
  79. package/dist/types/src/trait_behaviors.d.ts.map +1 -0
  80. package/dist/types/src/virtual_node.d.ts +10 -0
  81. package/dist/types/src/virtual_node.d.ts.map +1 -0
  82. package/dist/types/tests/backend/domlike.test.d.ts +2 -0
  83. package/dist/types/tests/backend/domlike.test.d.ts.map +1 -0
  84. package/dist/types/tests/base/env.d.ts +29 -0
  85. package/dist/types/tests/base/env.d.ts.map +1 -0
  86. package/dist/types/tests/base/match.d.ts +9 -0
  87. package/dist/types/tests/base/match.d.ts.map +1 -0
  88. package/dist/types/tests/core/backend.test.d.ts +2 -0
  89. package/dist/types/tests/core/backend.test.d.ts.map +1 -0
  90. package/dist/types/tests/core/behavior.test.d.ts +2 -0
  91. package/dist/types/tests/core/behavior.test.d.ts.map +1 -0
  92. package/dist/types/tests/core/component_space.test.d.ts +2 -0
  93. package/dist/types/tests/core/component_space.test.d.ts.map +1 -0
  94. package/dist/types/tests/core/data_update.test.d.ts +2 -0
  95. package/dist/types/tests/core/data_update.test.d.ts.map +1 -0
  96. package/dist/types/tests/core/misc.test.d.ts +2 -0
  97. package/dist/types/tests/core/misc.test.d.ts.map +1 -0
  98. package/dist/types/tests/core/placeholder.test.d.ts +2 -0
  99. package/dist/types/tests/core/placeholder.test.d.ts.map +1 -0
  100. package/dist/types/tests/core/slot.test.d.ts +2 -0
  101. package/dist/types/tests/core/slot.test.d.ts.map +1 -0
  102. package/dist/types/tests/core/trait_behaviors.test.d.ts +2 -0
  103. package/dist/types/tests/core/trait_behaviors.test.d.ts.map +1 -0
  104. package/dist/types/tests/tmpl/binding_map.test.d.ts +2 -0
  105. package/dist/types/tests/tmpl/binding_map.test.d.ts.map +1 -0
  106. package/dist/types/tests/tmpl/event.test.d.ts +2 -0
  107. package/dist/types/tests/tmpl/event.test.d.ts.map +1 -0
  108. package/dist/types/tests/tmpl/expression.test.d.ts +2 -0
  109. package/dist/types/tests/tmpl/expression.test.d.ts.map +1 -0
  110. package/dist/types/tests/tmpl/lvalue.test.d.ts +2 -0
  111. package/dist/types/tests/tmpl/lvalue.test.d.ts.map +1 -0
  112. package/dist/types/tests/tmpl/native_rendering.test.d.ts +2 -0
  113. package/dist/types/tests/tmpl/native_rendering.test.d.ts.map +1 -0
  114. package/dist/types/tests/tmpl/structure.test.d.ts +2 -0
  115. package/dist/types/tests/tmpl/structure.test.d.ts.map +1 -0
  116. package/dist/types/tests/types/chaining.test.d.ts +2 -0
  117. package/dist/types/tests/types/chaining.test.d.ts.map +1 -0
  118. package/dist/types/tests/types/createElement.test.d.ts +2 -0
  119. package/dist/types/tests/types/createElement.test.d.ts.map +1 -0
  120. package/dist/types/tests/types/definition.test.d.ts +2 -0
  121. package/dist/types/tests/types/definition.test.d.ts.map +1 -0
  122. package/guide/zh_CN/advanced/binding_map_update.md +32 -0
  123. package/guide/zh_CN/advanced/build_args.md +28 -0
  124. package/guide/zh_CN/advanced/component_filter.md +70 -0
  125. package/guide/zh_CN/advanced/component_space.md +124 -0
  126. package/guide/zh_CN/advanced/custom_backend.md +53 -0
  127. package/guide/zh_CN/advanced/error_listener.md +32 -0
  128. package/guide/zh_CN/advanced/external_component.md +73 -0
  129. package/guide/zh_CN/advanced/template_engine.md +61 -0
  130. package/guide/zh_CN/appendix/backend_protocol.md +501 -0
  131. package/guide/zh_CN/appendix/list_diff_algorithm.md +406 -0
  132. package/guide/zh_CN/basic/beginning.md +94 -0
  133. package/guide/zh_CN/basic/component.md +156 -0
  134. package/guide/zh_CN/basic/event.md +169 -0
  135. package/guide/zh_CN/basic/lifetime.md +66 -0
  136. package/guide/zh_CN/basic/method.md +62 -0
  137. package/guide/zh_CN/basic/template.md +135 -0
  138. package/guide/zh_CN/data_management/advanced_update.md +170 -0
  139. package/guide/zh_CN/data_management/data_deep_copy.md +157 -0
  140. package/guide/zh_CN/data_management/data_observer.md +154 -0
  141. package/guide/zh_CN/data_management/property_early_init.md +31 -0
  142. package/guide/zh_CN/data_management/pure_data_pattern.md +21 -0
  143. package/guide/zh_CN/index.md +93 -0
  144. package/guide/zh_CN/interaction/behavior.md +52 -0
  145. package/guide/zh_CN/interaction/component_path.md +37 -0
  146. package/guide/zh_CN/interaction/generic.md +73 -0
  147. package/guide/zh_CN/interaction/placeholder.md +40 -0
  148. package/guide/zh_CN/interaction/relation.md +151 -0
  149. package/guide/zh_CN/interaction/slot.md +137 -0
  150. package/guide/zh_CN/interaction/template_import.md +94 -0
  151. package/guide/zh_CN/interaction/trait_behavior.md +117 -0
  152. package/guide/zh_CN/styling/external_class.md +46 -0
  153. package/guide/zh_CN/styling/style_isolation.md +54 -0
  154. package/guide/zh_CN/styling/virtual_host.md +52 -0
  155. package/guide/zh_CN/tree/element_iterator.md +54 -0
  156. package/guide/zh_CN/tree/mutation_observer.md +52 -0
  157. package/guide/zh_CN/tree/node_tree.md +142 -0
  158. package/guide/zh_CN/tree/node_tree_modification.md +78 -0
  159. package/guide/zh_CN/tree/selector.md +66 -0
  160. package/jest.config.js +6 -0
  161. package/jest.dts.config.js +9 -0
  162. package/jest.unit.config.js +14 -0
  163. package/package.json +28 -0
  164. package/src/backend/backend_protocol.ts +313 -0
  165. package/src/backend/composed_backend_protocol.ts +252 -0
  166. package/src/backend/domlike_backend_protocol.ts +370 -0
  167. package/src/backend/mode.ts +51 -0
  168. package/src/backend/suggested_backend_protocol.ts +83 -0
  169. package/src/behavior.ts +1655 -0
  170. package/src/bootstrap_dom_dev.js +22 -0
  171. package/src/class_list.ts +376 -0
  172. package/src/component.ts +1309 -0
  173. package/src/component_params.ts +461 -0
  174. package/src/component_space.ts +547 -0
  175. package/src/data_path.ts +225 -0
  176. package/src/data_proxy.ts +670 -0
  177. package/src/data_utils.ts +50 -0
  178. package/src/element.ts +1966 -0
  179. package/src/element_iterator.ts +158 -0
  180. package/src/event.ts +401 -0
  181. package/src/external_shadow_tree.ts +27 -0
  182. package/src/func_arr.ts +198 -0
  183. package/src/global_options.ts +242 -0
  184. package/src/index.ts +187 -0
  185. package/src/mutation_observer.ts +252 -0
  186. package/src/native_node.ts +74 -0
  187. package/src/node.ts +174 -0
  188. package/src/relation.ts +380 -0
  189. package/src/render.ts +25 -0
  190. package/src/selector.ts +218 -0
  191. package/src/shadow_root.ts +766 -0
  192. package/src/template_engine.ts +45 -0
  193. package/src/text_node.ts +149 -0
  194. package/src/tmpl/index.ts +199 -0
  195. package/src/tmpl/native_rendering.ts +175 -0
  196. package/src/tmpl/proc_gen_wrapper.ts +954 -0
  197. package/src/tmpl/proc_gen_wrapper_dom.ts +230 -0
  198. package/src/tmpl/range_list_diff.ts +443 -0
  199. package/src/trait_behaviors.ts +51 -0
  200. package/src/virtual_node.ts +51 -0
  201. package/tests/backend/domlike.test.ts +254 -0
  202. package/tests/base/env.ts +78 -0
  203. package/tests/base/match.ts +185 -0
  204. package/tests/core/backend.test.ts +144 -0
  205. package/tests/core/behavior.test.ts +546 -0
  206. package/tests/core/component_space.test.ts +212 -0
  207. package/tests/core/data_update.test.ts +461 -0
  208. package/tests/core/misc.test.ts +339 -0
  209. package/tests/core/placeholder.test.ts +180 -0
  210. package/tests/core/slot.test.ts +1495 -0
  211. package/tests/core/trait_behaviors.test.ts +153 -0
  212. package/tests/legacy/README.md +3 -0
  213. package/tests/legacy/behavior.test.js +293 -0
  214. package/tests/legacy/component.test.js +1247 -0
  215. package/tests/legacy/data_path.test.js +149 -0
  216. package/tests/legacy/data_proxy.test.js +759 -0
  217. package/tests/legacy/element_iterator.test.js +148 -0
  218. package/tests/legacy/event.test.js +849 -0
  219. package/tests/legacy/external.test.js +510 -0
  220. package/tests/legacy/extra_info.test.js +109 -0
  221. package/tests/legacy/generics.test.js +176 -0
  222. package/tests/legacy/mutation_observer.test.js +210 -0
  223. package/tests/legacy/relation.test.js +517 -0
  224. package/tests/legacy/selector.test.js +263 -0
  225. package/tests/legacy/slot.test.js +915 -0
  226. package/tests/legacy/virtual.test.js +394 -0
  227. package/tests/tmpl/binding_map.test.ts +208 -0
  228. package/tests/tmpl/event.test.ts +206 -0
  229. package/tests/tmpl/expression.test.ts +429 -0
  230. package/tests/tmpl/lvalue.test.ts +160 -0
  231. package/tests/tmpl/native_rendering.test.ts +155 -0
  232. package/tests/tmpl/structure.test.ts +998 -0
  233. package/tests/types/chaining.test.ts +614 -0
  234. package/tests/types/createElement.test.ts +82 -0
  235. package/tests/types/definition.test.ts +442 -0
  236. package/tsconfig.json +11 -0
  237. package/webpack.config.js +270 -0
@@ -0,0 +1,510 @@
1
+ /* eslint-disable */
2
+
3
+ const { tmpl, domBackend, shadowBackend } = require('../base/env')
4
+ const glassEasel = require('../../src')
5
+
6
+ const componentSpace = new glassEasel.ComponentSpace()
7
+ componentSpace.updateComponentOptions({
8
+ writeFieldsToNode: true,
9
+ })
10
+ componentSpace.defineComponent({
11
+ is: '',
12
+ })
13
+
14
+ const regElem = (config) => {
15
+ const { template, ...c } = config
16
+ if (template) c.template = tmpl(template)
17
+ return componentSpace.defineComponent(c)
18
+ }
19
+
20
+ const createElem = (is, backend) => {
21
+ const def = componentSpace.getComponent(is)
22
+ return glassEasel.Component.createWithContext(is || 'test', def, backend || domBackend)
23
+ }
24
+
25
+ var matchElementWithDom = require('../base/match').native
26
+
27
+ describe('Element', function(){
28
+ var root = null
29
+
30
+ beforeAll(function(){
31
+ root = createElem('root')
32
+ root.$$.id = 'root'
33
+ var placeholder = document.createElement('div')
34
+ document.body.appendChild(placeholder)
35
+ glassEasel.Element.replaceDocumentElement(root, document.body, placeholder)
36
+
37
+ regElem({
38
+ is: 'element-a',
39
+ options: {
40
+ externalComponent: true,
41
+ dataDeepCopy: glassEasel.DeepCopyKind.None,
42
+ },
43
+ template: '<p>{{s}}</p> <slot></slot>',
44
+ properties: {
45
+ s: {
46
+ type: String,
47
+ value: 'DEFAULT'
48
+ }
49
+ },
50
+ created: function(){
51
+ this._attached = false
52
+ this._attachedTimes = 0
53
+ this._movedTimes = 0
54
+ this._detachedTimes = 0
55
+ },
56
+ attached: function(){
57
+ expect(this._attached).toBe(false)
58
+ this._attached = true
59
+ this._attachedTimes ++
60
+ },
61
+ moved: function(){
62
+ expect(this._attached).toBe(true)
63
+ this._movedTimes ++
64
+ },
65
+ detached: function(){
66
+ expect(this._attached).toBe(true)
67
+ this._attached = false
68
+ this._detachedTimes ++
69
+ }
70
+ })
71
+ })
72
+
73
+ it('should be able to register and create element', function(){
74
+ var elem = createElem('element-a')
75
+ root.appendChild(elem)
76
+
77
+ expect(elem).toBeInstanceOf(glassEasel.Element)
78
+ expect(elem.parentNode).toBe(root)
79
+ expect(elem.childNodes).toStrictEqual([])
80
+ expect(elem.$$).toBeInstanceOf(window.HTMLElement)
81
+ expect(elem.$$.childNodes[0].tagName).toBe('P')
82
+ expect(elem.$$.childNodes[1].tagName).toBe('VIRTUAL')
83
+ expect(elem.$$.childNodes[0].childNodes[0].textContent).toBe('DEFAULT')
84
+ })
85
+
86
+ it('should call attached, moved, and detached', function(){
87
+ var e1 = createElem('element-a')
88
+ var e2 = createElem('element-a')
89
+ var e3 = createElem('element-a')
90
+ var e4 = createElem('element-a')
91
+ e1.id = 'e1'
92
+ e2.id = 'e2'
93
+ e3.id = 'e3'
94
+ e4.id = 'e4'
95
+
96
+ // attach to a detached parent
97
+ e1.appendChild(e2)
98
+ e2.appendChild(e3)
99
+ e2.insertBefore(e4, e3)
100
+ expect(e1._attached).toBe(false)
101
+ expect(e2._attached).toBe(false)
102
+ expect(e3._attached).toBe(false)
103
+ expect(e4._attached).toBe(false)
104
+ expect(e3._movedTimes).toBe(0)
105
+ expect(e4._movedTimes).toBe(0)
106
+
107
+ // attach to an attached parent
108
+ root.appendChild(e1)
109
+ expect(e1._attached).toBe(true)
110
+ expect(e2._attached).toBe(true)
111
+ expect(e3._attached).toBe(true)
112
+ expect(e4._attached).toBe(true)
113
+ expect(e1._attachedTimes).toBe(1)
114
+ expect(e2._attachedTimes).toBe(1)
115
+ expect(e3._attachedTimes).toBe(1)
116
+ expect(e4._attachedTimes).toBe(1)
117
+
118
+ // move a child
119
+ e2.insertBefore(e3, e4)
120
+ expect(e3._movedTimes).toBe(1)
121
+ expect(e4._movedTimes).toBe(0)
122
+ expect(e4._attached).toBe(true)
123
+ e2.replaceChild(e3, e4)
124
+ e2.replaceChild(e3, e3)
125
+ expect(e2._movedTimes).toBe(0)
126
+ expect(e3._movedTimes).toBe(3)
127
+ expect(e4._movedTimes).toBe(0)
128
+ expect(e4._attached).toBe(false)
129
+ expect(e3._attachedTimes).toBe(1)
130
+ expect(e3._detachedTimes).toBe(0)
131
+ expect(e4._attachedTimes).toBe(1)
132
+ expect(e4._detachedTimes).toBe(1)
133
+
134
+ // detach from an attached parent
135
+ e1.removeChild(e2)
136
+ expect(e1._attached).toBe(true)
137
+ expect(e2._attached).toBe(false)
138
+ expect(e3._attached).toBe(false)
139
+ expect(e1._attachedTimes).toBe(1)
140
+ expect(e2._attachedTimes).toBe(1)
141
+ expect(e3._attachedTimes).toBe(1)
142
+ expect(e1._detachedTimes).toBe(0)
143
+ expect(e2._detachedTimes).toBe(1)
144
+ expect(e3._detachedTimes).toBe(1)
145
+
146
+ // detech from an detached parent
147
+ e2.removeChild(e3)
148
+ expect(e1._attached).toBe(true)
149
+ expect(e2._attached).toBe(false)
150
+ expect(e3._attached).toBe(false)
151
+ expect(e1._detachedTimes).toBe(0)
152
+ expect(e2._detachedTimes).toBe(1)
153
+ expect(e3._detachedTimes).toBe(1)
154
+ })
155
+
156
+ describe('#appendChild', function(){
157
+
158
+ it('should work for detached child', function(){
159
+ var parent = createElem('element-a')
160
+ parent.id = 'p'
161
+ root.appendChild(parent)
162
+ var child1 = createElem('element-a')
163
+ child1.id = 'c'
164
+ parent.appendChild(child1)
165
+ expect(child1._attached).toBe(true)
166
+ matchElementWithDom({
167
+ element: parent,
168
+ childNodes: [{
169
+ element: child1
170
+ }]
171
+ })
172
+ })
173
+
174
+ it('should work for appended child', function(){
175
+ var parent = createElem('element-a')
176
+ root.appendChild(parent)
177
+ var child1 = createElem('element-a')
178
+ child1.id = 'c1'
179
+ var child2 = createElem('element-a')
180
+ child2.id = 'c2'
181
+ var waitingEvents = 4
182
+ var observer = glassEasel.Observer.create(function(e){
183
+ if(waitingEvents > 2) {
184
+ expect(e.addedNodes[0]._attached).toBe(true)
185
+ expect(e.removedNodes).toBe(undefined)
186
+ } else if(waitingEvents === 2) {
187
+ expect(e.addedNodes[0]).toBe(e.removedNodes[0])
188
+ expect(e.removedNodes[0]._attached).toBe(true)
189
+ } else {
190
+ expect(e.addedNodes).toBe(undefined)
191
+ expect(e.removedNodes[0]._attached).toBe(true)
192
+ }
193
+ waitingEvents --
194
+ })
195
+ observer.observe(parent, {childList: true})
196
+
197
+ parent.appendChild(child1)
198
+ parent.appendChild(child2)
199
+ matchElementWithDom({
200
+ element: parent,
201
+ childNodes: [{
202
+ element: child1
203
+ }, {
204
+ element: child2
205
+ }]
206
+ })
207
+
208
+ parent.insertBefore(child2, child1)
209
+ matchElementWithDom({
210
+ element: parent,
211
+ childNodes: [{
212
+ element: child2
213
+ }, {
214
+ element: child1
215
+ }]
216
+ })
217
+
218
+ child2.appendChild(child1)
219
+ matchElementWithDom({
220
+ element: parent,
221
+ childNodes: [{
222
+ element: child2,
223
+ childNodes: [{
224
+ element: child1
225
+ }]
226
+ }]
227
+ })
228
+
229
+ expect(waitingEvents).toBe(0)
230
+ })
231
+
232
+ })
233
+
234
+ describe('#insertBefore', function(){
235
+
236
+ it('should work for detached child', function(){
237
+ var parent = createElem('element-a')
238
+ root.appendChild(parent)
239
+ var waitingEvents = 3
240
+ var observer = glassEasel.Observer.create(function(e){
241
+ waitingEvents--
242
+ expect(e.addedNodes[0]._attached).toBe(true)
243
+ })
244
+ observer.observe(parent, {childList: true})
245
+
246
+ var child1 = createElem('element-a')
247
+ var child2 = createElem('element-a')
248
+ parent.insertBefore(child1, child2)
249
+ parent.appendChild(child1)
250
+ parent.insertBefore(child2, child1)
251
+ matchElementWithDom({
252
+ element: parent,
253
+ childNodes: [{
254
+ element: child2
255
+ }, {
256
+ element: child1
257
+ }]
258
+ })
259
+ expect(waitingEvents).toBe(0)
260
+ })
261
+
262
+ it('should work for appended child', function(){
263
+ var parent = createElem('element-a')
264
+ root.appendChild(parent)
265
+ var child1 = createElem('element-a')
266
+ var child2 = createElem('element-a')
267
+ var waitingEvents = 2
268
+ var observer = glassEasel.Observer.create(function(e){
269
+ waitingEvents--
270
+ expect(e.addedNodes[0]._attached).toBe(true)
271
+ })
272
+ observer.observe(parent, {childList: true})
273
+
274
+ parent.appendChild(child1)
275
+ child1.appendChild(child2)
276
+ parent.insertBefore(child2, child1)
277
+ matchElementWithDom({
278
+ element: parent,
279
+ childNodes: [{
280
+ element: child2
281
+ }, {
282
+ element: child1
283
+ }]
284
+ })
285
+ expect(waitingEvents).toBe(0)
286
+ })
287
+
288
+ it('should work for appended child (on the same parent element)', function(){
289
+ var parent = createElem('element-a')
290
+ root.appendChild(parent)
291
+ var child1 = createElem('element-a')
292
+ var child2 = createElem('element-a')
293
+ var child3 = createElem('element-a')
294
+ var child4 = createElem('element-a')
295
+ var waitingEvents = 5
296
+ var observer = glassEasel.Observer.create(function(e){
297
+ if(waitingEvents-- !== 1) {
298
+ expect(e.addedNodes[0]._attached).toBe(true)
299
+ } else {
300
+ expect(e.addedNodes[0]).toBe(e.removedNodes[0])
301
+ expect(e.removedNodes[0]._attached).toBe(true)
302
+ }
303
+ })
304
+ observer.observe(parent, {childList: true})
305
+
306
+ parent.insertBefore(child1)
307
+ parent.insertBefore(child2)
308
+ parent.insertBefore(child3)
309
+ parent.insertBefore(child4)
310
+ parent.insertBefore(child2, child4)
311
+ matchElementWithDom({
312
+ element: parent,
313
+ childNodes: [{
314
+ element: child1
315
+ }, {
316
+ element: child3
317
+ }, {
318
+ element: child2
319
+ }, {
320
+ element: child4
321
+ }]
322
+ })
323
+ expect(waitingEvents).toBe(0)
324
+ })
325
+
326
+ })
327
+
328
+ describe('#removeChild', function(){
329
+
330
+ it('should work for appended child', function(){
331
+ var parent = createElem('element-a')
332
+ root.appendChild(parent)
333
+ var waitingEvents = 2
334
+ var observer = glassEasel.Observer.create(function(e){
335
+ if(waitingEvents-- === 2) {
336
+ expect(e.addedNodes[0]._attached).toBe(true)
337
+ } else {
338
+ expect(e.removedNodes[0]._attached).toBe(false)
339
+ }
340
+ })
341
+ observer.observe(parent, {childList: true})
342
+
343
+ var child1 = createElem('element-a')
344
+ parent.appendChild(child1)
345
+ parent.removeChild(child1)
346
+ matchElementWithDom({
347
+ element: parent,
348
+ childNodes: []
349
+ })
350
+ expect(waitingEvents).toBe(0)
351
+ })
352
+
353
+ it('should work for detached child', function(){
354
+ var parent = createElem('element-a')
355
+ root.appendChild(parent)
356
+ var child1 = createElem('element-a')
357
+ parent.removeChild(child1)
358
+ matchElementWithDom({
359
+ element: parent,
360
+ childNodes: []
361
+ })
362
+ })
363
+
364
+ })
365
+
366
+ describe('#replaceChild', function(){
367
+
368
+ it('should work for detached child', function(){
369
+ var parent = createElem('element-a')
370
+ root.appendChild(parent)
371
+ var waitingEvents = 4
372
+ var observer = glassEasel.Observer.create(function(e){
373
+ if(waitingEvents-- !== 2) {
374
+ expect(e.addedNodes[0]._attached).toBe(true)
375
+ } else {
376
+ expect(e.removedNodes[0]._attached).toBe(false)
377
+ }
378
+ })
379
+ observer.observe(parent, {childList: true})
380
+
381
+ var child1 = createElem('element-a')
382
+ var child2 = createElem('element-a')
383
+ var child3 = createElem('element-a')
384
+ parent.insertBefore(child1)
385
+ parent.insertBefore(child2)
386
+ parent.replaceChild(child3, child1)
387
+ matchElementWithDom({
388
+ element: parent,
389
+ childNodes: [{
390
+ element: child3
391
+ }, {
392
+ element: child2
393
+ }]
394
+ })
395
+ expect(waitingEvents).toBe(0)
396
+ })
397
+
398
+ it('should work for appended child', function(){
399
+ var parent = createElem('element-a')
400
+ root.appendChild(parent)
401
+ var child1 = createElem('element-a')
402
+ var child2 = createElem('element-a')
403
+ var child3 = createElem('element-a')
404
+ var waitingEvents = 4
405
+ var observer = glassEasel.Observer.create(function(e){
406
+ if(waitingEvents-- !== 2) {
407
+ expect(e.addedNodes[0]._attached).toBe(true)
408
+ } else {
409
+ expect(e.removedNodes[0]._attached).toBe(false)
410
+ }
411
+ })
412
+ observer.observe(parent, {childList: true})
413
+
414
+ parent.appendChild(child1)
415
+ parent.appendChild(child2)
416
+ child2.appendChild(child3)
417
+ parent.replaceChild(child3, child2)
418
+ matchElementWithDom({
419
+ element: parent,
420
+ childNodes: [{
421
+ element: child1
422
+ }, {
423
+ element: child3
424
+ }]
425
+ })
426
+ expect(waitingEvents).toBe(0)
427
+ })
428
+
429
+ it('should work for appended child (child === oldChild)', function(){
430
+ var parent = createElem('element-a')
431
+ root.appendChild(parent)
432
+ var child1 = createElem('element-a')
433
+ var child2 = createElem('element-a')
434
+ var waitingEvents = 3
435
+ var observer = glassEasel.Observer.create(function(e){
436
+ if(waitingEvents-- !== 1) {
437
+ expect(e.addedNodes[0]._attached).toBe(true)
438
+ } else {
439
+ expect(e.removedNodes[0]._attached).toBe(true)
440
+ }
441
+ })
442
+ observer.observe(parent, {childList: true})
443
+
444
+ parent.appendChild(child1)
445
+ parent.appendChild(child2)
446
+ parent.replaceChild(child1, child1)
447
+ matchElementWithDom({
448
+ element: parent,
449
+ childNodes: [{
450
+ element: child1
451
+ }, {
452
+ element: child2
453
+ }]
454
+ })
455
+ expect(waitingEvents).toBe(0)
456
+ })
457
+
458
+ it('should work for appended child (on the same parent element)', function(){
459
+ var parent = createElem('element-a')
460
+ root.appendChild(parent)
461
+ var child1 = createElem('element-a')
462
+ var child2 = createElem('element-a')
463
+ var child3 = createElem('element-a')
464
+ var child4 = createElem('element-a')
465
+ var waitingEvents = 6
466
+ var observer = glassEasel.Observer.create(function(e){
467
+ if(waitingEvents > 2) {
468
+ expect(e.addedNodes[0]._attached).toBe(true)
469
+ } else if(waitingEvents === 2) {
470
+ expect(e.removedNodes[0]._attached).toBe(false)
471
+ } else {
472
+ expect(e.addedNodes[0]).toBe(e.removedNodes[0])
473
+ expect(e.removedNodes[0]._attached).toBe(true)
474
+ }
475
+ waitingEvents--
476
+ })
477
+ observer.observe(parent, {childList: true})
478
+
479
+ parent.appendChild(child1)
480
+ parent.appendChild(child2)
481
+ parent.appendChild(child3)
482
+ parent.appendChild(child4)
483
+ parent.replaceChild(child2, child4)
484
+ matchElementWithDom({
485
+ element: parent,
486
+ childNodes: [{
487
+ element: child1
488
+ }, {
489
+ element: child3
490
+ }, {
491
+ element: child2
492
+ }]
493
+ })
494
+ expect(waitingEvents).toBe(0)
495
+ })
496
+
497
+ })
498
+
499
+ it('should support style segments', function(){
500
+ var e = createElem('element-a')
501
+ e.setNodeStyle('color: red')
502
+ expect(e.$$.style.color).toBe('red')
503
+ e.setNodeStyle('font-size: 16px', 1)
504
+ expect(e.$$.style.color).toBe('red')
505
+ expect(e.$$.style.fontSize).toBe('16px')
506
+ e.setNodeStyle('text-align: center', 3)
507
+ expect(e.$$.getAttribute('style')).toBe('color: red;font-size: 16px;;text-align: center')
508
+ })
509
+
510
+ })
@@ -0,0 +1,109 @@
1
+ /* eslint-disable */
2
+
3
+ const { tmpl, domBackend } = require('../base/env')
4
+ const glassEasel = require('../../src')
5
+
6
+ const componentSpace = new glassEasel.ComponentSpace()
7
+ componentSpace.updateComponentOptions({
8
+ writeFieldsToNode: true,
9
+ })
10
+ componentSpace.defineComponent({
11
+ is: '',
12
+ })
13
+
14
+ const regElem = (config) => {
15
+ const { template, ...c } = config
16
+ if (template) c.template = tmpl(template)
17
+ return componentSpace.defineComponent(c)
18
+ }
19
+
20
+ const createElem = (is, backend) => {
21
+ const def = componentSpace.getComponent(is)
22
+ return glassEasel.Component.createWithContext(is || 'test', def, backend || domBackend)
23
+ }
24
+
25
+ describe('Extra Info', function(){
26
+
27
+ beforeAll(function(){
28
+ glassEasel.globalOptions.writeExtraInfoToAttr = true
29
+ })
30
+
31
+ it('should output id', function(){
32
+ regElem({
33
+ is: 'extra-info-id',
34
+ template: '<span id="a"></span>'
35
+ })
36
+ var elem = createElem('extra-info-id')
37
+ expect(elem.$.a.$$.getAttribute('exparser:info-attr-id')).toBe('a')
38
+ })
39
+
40
+ it('should output component id', function(){
41
+ regElem({
42
+ is: 'extra-info-component-id-sub'
43
+ })
44
+ regElem({
45
+ is: 'extra-info-component-id',
46
+ template: '<span><extra-info-component-id-sub id="a"></extra-info-component-id-sub></span>'
47
+ })
48
+ var elem = createElem('extra-info-component-id')
49
+ expect(elem.$.a.$$.getAttribute('exparser:info-component-id') > 0).toBe(true)
50
+ expect(elem.$$.getAttribute('exparser:info-component-id') > 0).toBe(true)
51
+ })
52
+
53
+ it('should output currect slot info (single slotted)', function(){
54
+ regElem({
55
+ is: 'extra-info-slot-a',
56
+ template: '<span id="a"/><slot/>'
57
+ })
58
+ regElem({
59
+ is: 'extra-info-slot-b',
60
+ template: '<a/><extra-info-slot-a id="a"><slot/><span id="b"/></extra-info-slot-a>'
61
+ })
62
+ regElem({
63
+ is: 'extra-info-slot',
64
+ template: '<extra-info-slot-b id="b"><p id="p"></p></extra-info-slot-b>'
65
+ })
66
+ var elem = createElem('extra-info-slot')
67
+ expect(elem.$.p.$$.getAttribute('exparser:info-in-slot-of')).toBe(elem.$.b.$$.getAttribute('exparser:info-component-id'))
68
+ expect(elem.$.b.$.b.$$.getAttribute('exparser:info-in-slot-of')).toBe(elem.$.b.$.a.$$.getAttribute('exparser:info-component-id'))
69
+ expect(elem.$.b.$.a.$.a.$$.getAttribute('exparser:info-in-slot-of')).toBe(null)
70
+ })
71
+
72
+ it('should output currect slot info (multiple slotted)', function(){
73
+ regElem({
74
+ is: 'extra-info-slot-multi-a',
75
+ template: '<span id="a"/><slot/>'
76
+ })
77
+ regElem({
78
+ is: 'extra-info-slot-multi-b',
79
+ options: {
80
+ multipleSlots: true
81
+ },
82
+ template: '<extra-info-slot-multi-a id="a"> <slot name="1" /> <slot name="2" /> <span id="b"/> </extra-info-slot-multi-a>'
83
+ })
84
+ regElem({
85
+ is: 'extra-info-slot-multi',
86
+ template: '<extra-info-slot-multi-b id="b"> <p id="p1" slot="1"></p> <p id="p2" slot="2"></p> </extra-info-slot-multi-b>'
87
+ })
88
+
89
+ var elem = createElem('extra-info-slot-multi')
90
+ expect(elem.$.p1.$$.getAttribute('exparser:info-in-slot-of')).toBe(elem.$.b.$$.getAttribute('exparser:info-component-id'))
91
+ expect(elem.$.p2.$$.getAttribute('exparser:info-in-slot-of')).toBe(elem.$.b.$$.getAttribute('exparser:info-component-id'))
92
+ expect(elem.$.b.$.b.$$.getAttribute('exparser:info-in-slot-of')).toBe(elem.$.b.$.a.$$.getAttribute('exparser:info-component-id'))
93
+ expect(elem.$.b.$.a.$.a.$$.getAttribute('exparser:info-in-slot-of')).toBe(null)
94
+
95
+ var newSlot1 = elem.$.b.shadowRoot.createVirtualNode('slot')
96
+ glassEasel.Element.setSlotName(newSlot1, '1')
97
+ var elemA = elem.$.b.$.a
98
+ elemA.replaceChild(newSlot1, elemA.childNodes[0])
99
+ expect(elem.$.p1.$$.getAttribute('exparser:info-in-slot-of')).toBe(elem.$.b.$$.getAttribute('exparser:info-component-id'))
100
+ expect(elem.$.p2.$$.getAttribute('exparser:info-in-slot-of')).toBe(elem.$.b.$$.getAttribute('exparser:info-component-id'))
101
+ expect(elem.$.b.$.b.$$.getAttribute('exparser:info-in-slot-of')).toBe(elem.$.b.$.a.$$.getAttribute('exparser:info-component-id'))
102
+ expect(elem.$.b.$.a.$.a.$$.getAttribute('exparser:info-in-slot-of')).toBe(null)
103
+ })
104
+
105
+ afterAll(function(){
106
+ glassEasel.globalOptions.writeExtraInfoToAttr = false
107
+ })
108
+
109
+ })