@gogocat/data-bind 1.12.0 → 2.0.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 (271) hide show
  1. package/.editorconfig +14 -14
  2. package/.vscode/launch.json +12 -12
  3. package/CONFIGURATION.md +294 -0
  4. package/REACTIVE_MODE.md +553 -0
  5. package/README.md +266 -829
  6. package/babel.config.json +30 -0
  7. package/dist/js/_escape.d.ts +14 -0
  8. package/dist/js/_escape.d.ts.map +1 -0
  9. package/dist/js/applyBinding.d.ts +11 -0
  10. package/dist/js/applyBinding.d.ts.map +1 -0
  11. package/dist/js/attrBinding.d.ts +12 -0
  12. package/dist/js/attrBinding.d.ts.map +1 -0
  13. package/dist/js/binder.d.ts +67 -0
  14. package/dist/js/binder.d.ts.map +1 -0
  15. package/dist/js/changeBinding.d.ts +19 -0
  16. package/dist/js/changeBinding.d.ts.map +1 -0
  17. package/dist/js/commentWrapper.d.ts +39 -0
  18. package/dist/js/commentWrapper.d.ts.map +1 -0
  19. package/dist/js/config.d.ts +55 -0
  20. package/dist/js/config.d.ts.map +1 -0
  21. package/dist/js/createBindingOption.d.ts +32 -0
  22. package/dist/js/createBindingOption.d.ts.map +1 -0
  23. package/dist/js/createEventBinding.d.ts +10 -0
  24. package/dist/js/createEventBinding.d.ts.map +1 -0
  25. package/dist/js/cssBinding.d.ts +15 -0
  26. package/dist/js/cssBinding.d.ts.map +1 -0
  27. package/dist/js/dataBind.js +2756 -2530
  28. package/dist/js/dataBind.min.js +8 -1
  29. package/dist/js/dataBind.min.js.map +1 -1
  30. package/dist/js/domWalker.d.ts +9 -0
  31. package/dist/js/domWalker.d.ts.map +1 -0
  32. package/dist/js/forOfBinding.d.ts +12 -0
  33. package/dist/js/forOfBinding.d.ts.map +1 -0
  34. package/dist/js/hoverBinding.d.ts +13 -0
  35. package/dist/js/hoverBinding.d.ts.map +1 -0
  36. package/dist/js/ifBinding.d.ts +12 -0
  37. package/dist/js/ifBinding.d.ts.map +1 -0
  38. package/dist/js/index.d.ts +10 -0
  39. package/dist/js/index.d.ts.map +1 -0
  40. package/dist/js/modelBinding.d.ts +12 -0
  41. package/dist/js/modelBinding.d.ts.map +1 -0
  42. package/dist/js/postProcess.d.ts +3 -0
  43. package/dist/js/postProcess.d.ts.map +1 -0
  44. package/dist/js/pubSub.d.ts +11 -0
  45. package/dist/js/pubSub.d.ts.map +1 -0
  46. package/dist/js/reactiveProxy.d.ts +28 -0
  47. package/dist/js/reactiveProxy.d.ts.map +1 -0
  48. package/dist/js/renderForOfBinding.d.ts +8 -0
  49. package/dist/js/renderForOfBinding.d.ts.map +1 -0
  50. package/dist/js/renderIfBinding.d.ts +22 -0
  51. package/dist/js/renderIfBinding.d.ts.map +1 -0
  52. package/dist/js/renderIteration.d.ts +16 -0
  53. package/dist/js/renderIteration.d.ts.map +1 -0
  54. package/dist/js/renderTemplate.d.ts +14 -0
  55. package/dist/js/renderTemplate.d.ts.map +1 -0
  56. package/dist/js/renderTemplatesBinding.d.ts +19 -0
  57. package/dist/js/renderTemplatesBinding.d.ts.map +1 -0
  58. package/dist/js/showBinding.d.ts +13 -0
  59. package/dist/js/showBinding.d.ts.map +1 -0
  60. package/dist/js/switchBinding.d.ts +13 -0
  61. package/dist/js/switchBinding.d.ts.map +1 -0
  62. package/dist/js/textBinding.d.ts +13 -0
  63. package/dist/js/textBinding.d.ts.map +1 -0
  64. package/dist/js/types/_escape.d.ts +14 -0
  65. package/dist/js/types/_escape.d.ts.map +1 -0
  66. package/dist/js/types/applyBinding.d.ts +11 -0
  67. package/dist/js/types/applyBinding.d.ts.map +1 -0
  68. package/dist/js/types/attrBinding.d.ts +12 -0
  69. package/dist/js/types/attrBinding.d.ts.map +1 -0
  70. package/dist/js/types/binder.d.ts +67 -0
  71. package/dist/js/types/binder.d.ts.map +1 -0
  72. package/dist/js/types/changeBinding.d.ts +19 -0
  73. package/dist/js/types/changeBinding.d.ts.map +1 -0
  74. package/dist/js/types/commentWrapper.d.ts +39 -0
  75. package/dist/js/types/commentWrapper.d.ts.map +1 -0
  76. package/dist/js/types/config.d.ts +55 -0
  77. package/dist/js/types/config.d.ts.map +1 -0
  78. package/dist/js/types/createBindingOption.d.ts +32 -0
  79. package/dist/js/types/createBindingOption.d.ts.map +1 -0
  80. package/dist/js/types/createEventBinding.d.ts +10 -0
  81. package/dist/js/types/createEventBinding.d.ts.map +1 -0
  82. package/dist/js/types/cssBinding.d.ts +15 -0
  83. package/dist/js/types/cssBinding.d.ts.map +1 -0
  84. package/dist/js/types/domWalker.d.ts +9 -0
  85. package/dist/js/types/domWalker.d.ts.map +1 -0
  86. package/dist/js/types/forOfBinding.d.ts +12 -0
  87. package/dist/js/types/forOfBinding.d.ts.map +1 -0
  88. package/dist/js/types/hoverBinding.d.ts +13 -0
  89. package/dist/js/types/hoverBinding.d.ts.map +1 -0
  90. package/dist/js/types/ifBinding.d.ts +12 -0
  91. package/dist/js/types/ifBinding.d.ts.map +1 -0
  92. package/dist/js/types/index.d.ts +10 -0
  93. package/dist/js/types/index.d.ts.map +1 -0
  94. package/dist/js/types/modelBinding.d.ts +12 -0
  95. package/dist/js/types/modelBinding.d.ts.map +1 -0
  96. package/dist/js/types/postProcess.d.ts +3 -0
  97. package/dist/js/types/postProcess.d.ts.map +1 -0
  98. package/dist/js/types/pubSub.d.ts +11 -0
  99. package/dist/js/types/pubSub.d.ts.map +1 -0
  100. package/dist/js/types/reactiveProxy.d.ts +28 -0
  101. package/dist/js/types/reactiveProxy.d.ts.map +1 -0
  102. package/dist/js/types/renderForOfBinding.d.ts +8 -0
  103. package/dist/js/types/renderForOfBinding.d.ts.map +1 -0
  104. package/dist/js/types/renderIfBinding.d.ts +22 -0
  105. package/dist/js/types/renderIfBinding.d.ts.map +1 -0
  106. package/dist/js/types/renderIteration.d.ts +16 -0
  107. package/dist/js/types/renderIteration.d.ts.map +1 -0
  108. package/dist/js/types/renderTemplate.d.ts +14 -0
  109. package/dist/js/types/renderTemplate.d.ts.map +1 -0
  110. package/dist/js/types/renderTemplatesBinding.d.ts +19 -0
  111. package/dist/js/types/renderTemplatesBinding.d.ts.map +1 -0
  112. package/dist/js/types/showBinding.d.ts +13 -0
  113. package/dist/js/types/showBinding.d.ts.map +1 -0
  114. package/dist/js/types/switchBinding.d.ts +13 -0
  115. package/dist/js/types/switchBinding.d.ts.map +1 -0
  116. package/dist/js/types/textBinding.d.ts +13 -0
  117. package/dist/js/types/textBinding.d.ts.map +1 -0
  118. package/dist/js/types/types.d.ts +111 -0
  119. package/dist/js/types/types.d.ts.map +1 -0
  120. package/dist/js/types/util.d.ts +119 -0
  121. package/dist/js/types/util.d.ts.map +1 -0
  122. package/dist/js/types.d.ts +111 -0
  123. package/dist/js/types.d.ts.map +1 -0
  124. package/dist/js/util.d.ts +119 -0
  125. package/dist/js/util.d.ts.map +1 -0
  126. package/eslint.config.js +124 -0
  127. package/examples/DBMONSTER_COMPARISON.md +123 -0
  128. package/examples/afterRenderDemo.html +119 -0
  129. package/examples/bootstrap/css/animate.css +1579 -1579
  130. package/examples/bootstrap/css/bootstrap.min.css +6 -6
  131. package/examples/bootstrap/css/homeservices.css +378 -390
  132. package/examples/bootstrap/css/open-iconic.css +511 -511
  133. package/examples/bootstrap/fonts/open-iconic.svg +543 -543
  134. package/examples/bootstrap/js/compMessageDialog.js +20 -19
  135. package/examples/bootstrap/js/compSearchBar.js +12 -19
  136. package/examples/bootstrap/js/compSearchResults.js +50 -46
  137. package/examples/bootstrap/js/featureAdsResult.json +65 -65
  138. package/examples/bootstrap/js/searchResult.json +57 -57
  139. package/examples/bootstrap.html +343 -332
  140. package/examples/css/baseTodo.css +141 -141
  141. package/examples/css/dbMonsterStyles.css +27 -27
  142. package/examples/css/indexTodo.css +374 -374
  143. package/examples/dbmonsterForOfReactive.html +40 -0
  144. package/examples/dbmonsterReact.html +19 -0
  145. package/examples/forOfBindingSimpleDebug.html +45 -0
  146. package/examples/globalConfig.html +131 -0
  147. package/examples/js/afterRenderDemo.js +190 -0
  148. package/examples/js/appTodo.js +46 -46
  149. package/examples/js/attrBindingDemo.js +2 -2
  150. package/examples/js/dbMonApp.js +24 -26
  151. package/examples/js/dbMonAppReact.jsx +79 -0
  152. package/examples/js/dbMonAppReactive.js +28 -0
  153. package/examples/js/fiberDemo.js +4 -4
  154. package/examples/js/filtersDemo.js +8 -8
  155. package/examples/js/forOfDemo.js +7 -9
  156. package/examples/js/forOfDemoComplex.js +44 -17
  157. package/examples/js/form.js +14 -14
  158. package/examples/js/globalConfig.js +117 -0
  159. package/examples/js/ifBindingDemo.js +16 -16
  160. package/examples/js/reactiveDemo.js +119 -0
  161. package/examples/js/switchBindingDemo.js +8 -8
  162. package/examples/react-dbmonster/dist/bundle.js +43 -0
  163. package/examples/react-dbmonster/package-lock.json +537 -0
  164. package/examples/react-dbmonster/package.json +16 -0
  165. package/examples/react-dbmonster/src/index.jsx +80 -0
  166. package/examples/reactiveDemo.html +127 -0
  167. package/examples/refreshRateTest.html +75 -75
  168. package/index.html +841 -0
  169. package/package.json +31 -34
  170. package/rollup.config.js +79 -36
  171. package/src/{_escape.js → _escape.ts} +19 -17
  172. package/src/{applyBinding.js → applyBinding.ts} +27 -18
  173. package/src/{attrBinding.js → attrBinding.ts} +14 -13
  174. package/src/{binder.js → binder.ts} +289 -181
  175. package/src/changeBinding.ts +93 -0
  176. package/src/{commentWrapper.js → commentWrapper.ts} +33 -30
  177. package/src/config.ts +107 -0
  178. package/src/{createBindingOption.js → createBindingOption.ts} +39 -15
  179. package/src/createEventBinding.ts +88 -0
  180. package/src/{cssBinding.js → cssBinding.ts} +13 -11
  181. package/src/{domWalker.js → domWalker.ts} +44 -30
  182. package/src/{forOfBinding.js → forOfBinding.ts} +4 -3
  183. package/src/hoverBinding.ts +84 -0
  184. package/src/{ifBinding.js → ifBinding.ts} +14 -12
  185. package/src/index.ts +53 -0
  186. package/src/{modelBinding.js → modelBinding.ts} +11 -9
  187. package/src/{postProcess.js → postProcess.ts} +6 -4
  188. package/src/{pubSub.js → pubSub.ts} +24 -21
  189. package/src/reactiveProxy.ts +285 -0
  190. package/src/{renderForOfBinding.js → renderForOfBinding.ts} +54 -32
  191. package/src/{renderIfBinding.js → renderIfBinding.ts} +41 -19
  192. package/src/{renderIteration.js → renderIteration.ts} +24 -8
  193. package/src/renderTemplate.ts +165 -0
  194. package/src/renderTemplatesBinding.ts +73 -0
  195. package/src/{showBinding.js → showBinding.ts} +4 -3
  196. package/src/{switchBinding.js → switchBinding.ts} +18 -15
  197. package/src/{textBinding.js → textBinding.ts} +5 -4
  198. package/src/types.ts +124 -0
  199. package/src/util.ts +810 -0
  200. package/test/css/reporter.css +9 -9
  201. package/test/globals.d.ts +19 -0
  202. package/test/helpers/testHelper.js +46 -11
  203. package/test/mocks/featureAdsResult.json +65 -65
  204. package/test/mocks/searchResult.json +57 -57
  205. package/test/specs/{attrBinding.spec.js → attrBinding.spec.ts} +103 -106
  206. package/test/specs/{binder.spec.js → binder.spec.ts} +29 -27
  207. package/test/specs/blurBinding.spec.ts +60 -0
  208. package/test/specs/chainableUse.spec.ts +125 -0
  209. package/test/specs/clickBinding.spec.ts +194 -0
  210. package/test/specs/{cssBinding.spec.js → cssBinding.spec.ts} +72 -79
  211. package/test/specs/{dataBindBootstrap.spec.js → dataBindBootstrap.spec.ts} +332 -313
  212. package/test/specs/{filter.spec.js → filter.spec.ts} +75 -76
  213. package/test/specs/{forOfBinding.spec.js → forOfBinding.spec.ts} +208 -219
  214. package/test/specs/formBinding.spec.ts +272 -0
  215. package/test/specs/ifBinding.spec.ts +165 -0
  216. package/test/specs/{nestedComponent.spec.js → nestedComponent.spec.ts} +88 -88
  217. package/test/specs/reactiveProxy.spec.ts +465 -0
  218. package/test/specs/{showBinding.spec.js → showBinding.spec.ts} +148 -149
  219. package/test/specs/{switchBinding.spec.js → switchBinding.spec.ts} +172 -173
  220. package/test/specs/templateBinding.spec.ts +273 -0
  221. package/test/specs/{textBinding.spec.js → textBinding.spec.ts} +47 -48
  222. package/test/tsconfig.json +31 -0
  223. package/test-output.txt +200 -0
  224. package/test-reactive.html +224 -0
  225. package/tsconfig.json +28 -0
  226. package/vendors/lodash.custom.js +4577 -4577
  227. package/vendors/lodash.custom.min.js +45 -45
  228. package/vitest.config.js +27 -0
  229. package/.eslintrc.js +0 -1
  230. package/.grunt/grunt-contrib-jasmine/boot.js +0 -161
  231. package/.grunt/grunt-contrib-jasmine/dist/js/dataBind.js +0 -9
  232. package/.grunt/grunt-contrib-jasmine/grunt-template-jasmine-istanbul/reporter.js +0 -23
  233. package/.grunt/grunt-contrib-jasmine/jasmine-html.js +0 -853
  234. package/.grunt/grunt-contrib-jasmine/jasmine.css +0 -271
  235. package/.grunt/grunt-contrib-jasmine/jasmine.js +0 -9761
  236. package/.grunt/grunt-contrib-jasmine/jasmine_favicon.png +0 -0
  237. package/.grunt/grunt-contrib-jasmine/json2.js +0 -489
  238. package/.grunt/grunt-contrib-jasmine/reporter.js +0 -107
  239. package/coverage/coverage.json +0 -1
  240. package/coverage/lcov/lcov-report/base.css +0 -213
  241. package/coverage/lcov/lcov-report/index.html +0 -93
  242. package/coverage/lcov/lcov-report/js/dataBind.js.html +0 -6596
  243. package/coverage/lcov/lcov-report/js/index.html +0 -93
  244. package/coverage/lcov/lcov-report/prettify.css +0 -1
  245. package/coverage/lcov/lcov-report/prettify.js +0 -1
  246. package/coverage/lcov/lcov-report/sort-arrow-sprite.png +0 -0
  247. package/coverage/lcov/lcov-report/sorter.js +0 -158
  248. package/coverage/lcov/lcov.info +0 -1991
  249. package/eslintrc.json +0 -40
  250. package/examples/bootstrap/js/bootstrap.min.js +0 -6
  251. package/examples/bootstrap/js/popper.min.js +0 -5
  252. package/examples/bootstrap/js/searchSuggestion.js +0 -58
  253. package/examples/bootstrap/js/typeahead.jquery.js +0 -1538
  254. package/gruntfile.js +0 -92
  255. package/gulpfile.js +0 -32
  256. package/src/applyBindingExport.js +0 -5
  257. package/src/changeBinding.js +0 -63
  258. package/src/config.js +0 -66
  259. package/src/createEventBinding.js +0 -46
  260. package/src/eventSystem.js +0 -46
  261. package/src/hoverBinding.js +0 -57
  262. package/src/index.js +0 -26
  263. package/src/renderTemplate.js +0 -128
  264. package/src/renderTemplatesBinding.js +0 -44
  265. package/src/util.js +0 -648
  266. package/test/specs/blurBinding.spec.js +0 -57
  267. package/test/specs/formBinding.spec.js +0 -316
  268. package/test/specs/ifBinding.spec.js +0 -169
  269. package/test/specs/templateBinding.spec.js +0 -117
  270. package/vendors/jasmine-jquery.js +0 -841
  271. package/vendors/jquery-3.2.1.min.js +0 -4
@@ -1,149 +1,148 @@
1
- describe('Given [data-bind-comp="show-component"] inited', () => {
2
- const namespace = {};
3
- const isVisible = function(el) {
4
- return el.offsetHeight > 0;
5
- };
6
-
7
- jasmine.getFixtures().fixturesPath = 'test';
8
-
9
- beforeEach(function() {
10
- loadFixtures('./fixtures/showBinding.html');
11
-
12
- namespace.viewModel = {
13
- heading: 'Test data-show-binding',
14
- displayHeading2: true,
15
- displayHeadingFn: function($data) {
16
- // test $data is refer to this viewModel;
17
- return typeof $data.displayHeadingFn === 'function';
18
- },
19
- displayHeading4: true,
20
- displayHeading5: true,
21
- displayHeading6: true,
22
- displayHeading7: true,
23
-
24
- updateView: function(opt) {
25
- this.APP.render(opt);
26
- },
27
- };
28
-
29
- namespace.myComponent = dataBind.init(document.querySelector('[data-bind-comp="show-component"]'), namespace.viewModel);
30
-
31
- namespace.myComponent.render();
32
- });
33
-
34
- afterEach(() => {
35
- // clean up all app/components
36
- for (const prop in namespace) {
37
- if (namespace.hasOwnProperty(prop)) {
38
- delete namespace[prop];
39
- }
40
- }
41
- });
42
-
43
- it('Then [data-bind-comp="myComponent"] should have render', (done) => {
44
- setTimeout(() => {
45
- expect(document.getElementById('heading').textContent).toBe(namespace.viewModel.heading);
46
- done();
47
- }, 200);
48
- });
49
-
50
- it('Should show or hide headings as defined in viewModel', (done) => {
51
- setTimeout(() => {
52
- const $heading2 = document.getElementById('heading2');
53
- const $heading2Invert = document.getElementById('heading2-invert');
54
- const $heading3 = document.getElementById('heading3');
55
- const $heading3Invert = document.getElementById('heading3-invert');
56
- const $heading4 = document.getElementById('heading4');
57
- const $heading5 = document.getElementById('heading5');
58
- const $heading6 = document.getElementById('heading6');
59
- const $heading7 = document.getElementById('heading7');
60
-
61
- expect($heading2.style.display).toBe('');
62
- expect(isVisible($heading2)).toBe(namespace.viewModel.displayHeading2);
63
-
64
- expect($heading2Invert.style.display).toBe('none');
65
- expect(isVisible($heading2Invert)).toBe(!namespace.viewModel.displayHeading2);
66
-
67
- expect($heading3.style.display).toBe('');
68
- expect(isVisible($heading3)).toBe(true);
69
-
70
- expect($heading3Invert.style.display).toBe('none');
71
- expect(isVisible($heading3Invert)).toBe(false);
72
-
73
- expect($heading4.style.display).toBe('');
74
- expect(isVisible($heading4)).toBe(namespace.viewModel.displayHeading4);
75
-
76
- expect($heading5.style.display).toBe('inline');
77
- expect(isVisible($heading5)).toBe(namespace.viewModel.displayHeading5);
78
-
79
- expect($heading6.style.display).toBe('');
80
- expect(isVisible($heading6)).toBe(namespace.viewModel.displayHeading6);
81
-
82
- expect($heading7.style.display).toBe('block');
83
- expect(isVisible($heading7)).toBe(namespace.viewModel.displayHeading7);
84
-
85
- done();
86
- }, 200);
87
- });
88
-
89
- it('Should hide headings2 after set displayHeading2 = false', (done) => {
90
- namespace.viewModel.displayHeading2 = false;
91
- namespace.viewModel.updateView();
92
-
93
- setTimeout(() => {
94
- const $heading2 = document.getElementById('heading2');
95
- expect($heading2.style.display).toBe('none');
96
- expect(isVisible($heading2)).toBe(namespace.viewModel.displayHeading2);
97
- done();
98
- }, 200);
99
- });
100
-
101
- it('Should hide heading2 but show heading2-invert as reverse boolean', (done) => {
102
- namespace.viewModel.displayHeading2 = false;
103
- namespace.viewModel.updateView();
104
-
105
- setTimeout(() => {
106
- const $heading2 = document.getElementById('heading2');
107
- const $heading2Invert = document.getElementById('heading2-invert');
108
-
109
- expect($heading2.style.display).toBe('none');
110
- expect(isVisible($heading2)).toBe(namespace.viewModel.displayHeading2);
111
-
112
- expect($heading2Invert.style.display).toBe('');
113
- expect(isVisible($heading2Invert)).toBe(!namespace.viewModel.displayHeading2);
114
- done();
115
- }, 200);
116
- });
117
-
118
- it('Should respect css rule display:flex after hide then show heading4', (done) => {
119
- namespace.viewModel.displayHeading4 = false;
120
- namespace.viewModel.updateView();
121
-
122
- setTimeout(() => {
123
- const $heading4 = document.getElementById('heading4');
124
-
125
- expect($heading4.style.display).toBe('none');
126
- expect(isVisible($heading4)).toBe(namespace.viewModel.displayHeading4);
127
-
128
- namespace.viewModel.displayHeading4 = true;
129
- namespace.viewModel.updateView();
130
- setTimeout(function() {
131
- const $heading4 = document.getElementById('heading4');
132
-
133
- expect($heading4.style.display).toBe('');
134
- expect(isVisible($heading4)).toBe(namespace.viewModel.displayHeading4);
135
- done();
136
- }, 300);
137
- }, 200);
138
- });
139
-
140
- it('Should not show heading8 as property is not defined in viewModel', (done) => {
141
- setTimeout(() => {
142
- const $heading8 = document.getElementById('heading8');
143
-
144
- expect($heading8.style.display).toBe('none');
145
- expect(isVisible($heading8)).toBe(false);
146
- done();
147
- }, 200);
148
- });
149
- });
1
+ import {describe, it, expect, beforeEach, afterEach} from 'vitest';
2
+ import {waitFor} from '@testing-library/dom';
3
+
4
+ describe('Given [data-bind-comp="show-component"] inited', () => {
5
+ const namespace: any = {};
6
+ const isVisible = function (el: HTMLElement) {
7
+ // In jsdom, offsetHeight is always 0, so check display style instead
8
+ return el.style.display !== 'none';
9
+ };
10
+
11
+ beforeEach(async () => {
12
+ loadFixture('test/fixtures/showBinding.html');
13
+
14
+ namespace.viewModel = {
15
+ heading: 'Test data-show-binding',
16
+ displayHeading2: true,
17
+ displayHeadingFn($data: any) {
18
+ // test $data is refer to this viewModel;
19
+ return typeof $data.displayHeadingFn === 'function';
20
+ },
21
+ displayHeading4: true,
22
+ displayHeading5: true,
23
+ displayHeading6: true,
24
+ displayHeading7: true,
25
+
26
+ updateView(opt?: any) {
27
+ this.APP.render(opt);
28
+ },
29
+ };
30
+
31
+ namespace.myComponent = dataBind.init(document.querySelector('[data-bind-comp="show-component"]'), namespace.viewModel);
32
+
33
+ await namespace.myComponent.render();
34
+ });
35
+
36
+ afterEach(() => {
37
+ // clean up all app/components
38
+ for (const prop in namespace) {
39
+ if (Object.prototype.hasOwnProperty.call(namespace, prop)) {
40
+ delete namespace[prop];
41
+ }
42
+ }
43
+ });
44
+
45
+ it('Then [data-bind-comp="myComponent"] should have render', async () => {
46
+ await waitFor(() => {
47
+ expect(document.getElementById('heading')!.textContent).toBe(namespace.viewModel.heading);
48
+ }, {timeout: 500});
49
+ });
50
+
51
+ it('Should show or hide headings as defined in viewModel', async () => {
52
+ await waitFor(() => {
53
+ const $heading2 = document.getElementById('heading2')!;
54
+ const $heading2Invert = document.getElementById('heading2-invert')!;
55
+ const $heading3 = document.getElementById('heading3')!;
56
+ const $heading3Invert = document.getElementById('heading3-invert')!;
57
+ const $heading4 = document.getElementById('heading4')!;
58
+ const $heading5 = document.getElementById('heading5')!;
59
+ const $heading6 = document.getElementById('heading6')!;
60
+ const $heading7 = document.getElementById('heading7')!;
61
+
62
+ expect($heading2.style.display).toBe('');
63
+ expect(isVisible($heading2)).toBe(namespace.viewModel.displayHeading2);
64
+
65
+ expect($heading2Invert.style.display).toBe('none');
66
+ expect(isVisible($heading2Invert)).toBe(!namespace.viewModel.displayHeading2);
67
+
68
+ expect($heading3.style.display).toBe('');
69
+ expect(isVisible($heading3)).toBe(true);
70
+
71
+ expect($heading3Invert.style.display).toBe('none');
72
+ expect(isVisible($heading3Invert)).toBe(false);
73
+
74
+ expect($heading4.style.display).toBe('');
75
+ expect(isVisible($heading4)).toBe(namespace.viewModel.displayHeading4);
76
+
77
+ expect($heading5.style.display).toBe('inline');
78
+ expect(isVisible($heading5)).toBe(namespace.viewModel.displayHeading5);
79
+
80
+ expect($heading6.style.display).toBe('');
81
+ expect(isVisible($heading6)).toBe(namespace.viewModel.displayHeading6);
82
+
83
+ expect($heading7.style.display).toBe('block');
84
+ expect(isVisible($heading7)).toBe(namespace.viewModel.displayHeading7);
85
+ }, {timeout: 500});
86
+ });
87
+
88
+
89
+ it('Should hide headings2 after set displayHeading2 = false', async () => {
90
+ namespace.viewModel.displayHeading2 = false;
91
+ await namespace.myComponent.render();
92
+
93
+ await waitFor(() => {
94
+ const $heading2 = document.getElementById('heading2')!;
95
+ expect($heading2.style.display).toBe('none');
96
+ expect(isVisible($heading2)).toBe(namespace.viewModel.displayHeading2);
97
+ }, {timeout: 500});
98
+ });
99
+
100
+
101
+ it('Should hide heading2 but show heading2-invert as reverse boolean', async () => {
102
+ namespace.viewModel.displayHeading2 = false;
103
+ await namespace.myComponent.render();
104
+
105
+ await waitFor(() => {
106
+ const $heading2 = document.getElementById('heading2')!;
107
+ const $heading2Invert = document.getElementById('heading2-invert')!;
108
+
109
+ expect($heading2.style.display).toBe('none');
110
+ expect(isVisible($heading2)).toBe(namespace.viewModel.displayHeading2);
111
+
112
+ expect($heading2Invert.style.display).toBe('');
113
+ expect(isVisible($heading2Invert)).toBe(!namespace.viewModel.displayHeading2);
114
+ }, {timeout: 500});
115
+ });
116
+
117
+
118
+ it('Should respect css rule display:flex after hide then show heading4', async () => {
119
+ // First hide heading4
120
+ namespace.viewModel.displayHeading4 = false;
121
+ await namespace.myComponent.render();
122
+
123
+ await waitFor(() => {
124
+ const $heading4 = document.getElementById('heading4')!;
125
+ expect($heading4.style.display).toBe('none');
126
+ expect(isVisible($heading4)).toBe(false);
127
+ }, {timeout: 500});
128
+
129
+ // Then show it again
130
+ namespace.viewModel.displayHeading4 = true;
131
+ await namespace.myComponent.render();
132
+
133
+ await waitFor(() => {
134
+ const $heading4 = document.getElementById('heading4')!;
135
+ expect($heading4.style.display).toBe('');
136
+ expect(isVisible($heading4)).toBe(true);
137
+ }, {timeout: 500});
138
+ });
139
+
140
+ it('Should not show heading8 as property is not defined in viewModel', async () => {
141
+ await waitFor(() => {
142
+ const $heading8 = document.getElementById('heading8')!;
143
+
144
+ expect($heading8.style.display).toBe('none');
145
+ expect(isVisible($heading8)).toBe(false);
146
+ }, {timeout: 500});
147
+ });
148
+ });