@gogocat/data-bind 1.11.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 (274) 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 +2772 -2519
  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/form.html +20 -4
  147. package/examples/globalConfig.html +131 -0
  148. package/examples/js/afterRenderDemo.js +190 -0
  149. package/examples/js/appTodo.js +46 -46
  150. package/examples/js/attrBindingDemo.js +2 -2
  151. package/examples/js/dbMonApp.js +24 -26
  152. package/examples/js/dbMonAppReact.jsx +79 -0
  153. package/examples/js/dbMonAppReactive.js +28 -0
  154. package/examples/js/fiberDemo.js +4 -4
  155. package/examples/js/filtersDemo.js +8 -8
  156. package/examples/js/forOfDemo.js +7 -9
  157. package/examples/js/forOfDemoComplex.js +44 -17
  158. package/examples/js/form.js +44 -12
  159. package/examples/js/globalConfig.js +117 -0
  160. package/examples/js/ifBindingDemo.js +16 -16
  161. package/examples/js/reactiveDemo.js +119 -0
  162. package/examples/js/switchBindingDemo.js +8 -8
  163. package/examples/react-dbmonster/dist/bundle.js +43 -0
  164. package/examples/react-dbmonster/package-lock.json +537 -0
  165. package/examples/react-dbmonster/package.json +16 -0
  166. package/examples/react-dbmonster/src/index.jsx +80 -0
  167. package/examples/reactiveDemo.html +127 -0
  168. package/examples/refreshRateTest.html +75 -75
  169. package/index.html +841 -0
  170. package/package.json +31 -34
  171. package/rollup.config.js +79 -36
  172. package/src/{_escape.js → _escape.ts} +19 -17
  173. package/src/applyBinding.ts +179 -0
  174. package/src/{attrBinding.js → attrBinding.ts} +14 -13
  175. package/src/binder.ts +289 -0
  176. package/src/changeBinding.ts +93 -0
  177. package/src/{commentWrapper.js → commentWrapper.ts} +33 -30
  178. package/src/config.ts +107 -0
  179. package/src/createBindingOption.ts +91 -0
  180. package/src/createEventBinding.ts +88 -0
  181. package/src/{cssBinding.js → cssBinding.ts} +13 -11
  182. package/src/{domWalker.js → domWalker.ts} +44 -30
  183. package/src/{forOfBinding.js → forOfBinding.ts} +4 -3
  184. package/src/hoverBinding.ts +84 -0
  185. package/src/{ifBinding.js → ifBinding.ts} +14 -12
  186. package/src/index.ts +53 -0
  187. package/src/{modelBinding.js → modelBinding.ts} +11 -9
  188. package/src/postProcess.ts +22 -0
  189. package/src/{pubSub.js → pubSub.ts} +24 -15
  190. package/src/reactiveProxy.ts +285 -0
  191. package/src/{renderForOfBinding.js → renderForOfBinding.ts} +55 -33
  192. package/src/{renderIfBinding.js → renderIfBinding.ts} +45 -20
  193. package/src/renderIteration.ts +53 -0
  194. package/src/renderTemplate.ts +165 -0
  195. package/src/renderTemplatesBinding.ts +73 -0
  196. package/src/{showBinding.js → showBinding.ts} +4 -3
  197. package/src/{switchBinding.js → switchBinding.ts} +18 -15
  198. package/src/{textBinding.js → textBinding.ts} +5 -4
  199. package/src/types.ts +124 -0
  200. package/src/util.ts +810 -0
  201. package/test/css/reporter.css +9 -9
  202. package/test/fixtures/dataBindBootstrap.html +2 -2
  203. package/test/fixtures/formBindings.html +9 -1
  204. package/test/globals.d.ts +19 -0
  205. package/test/helpers/testHelper.js +46 -11
  206. package/test/mocks/featureAdsResult.json +65 -65
  207. package/test/mocks/searchResult.json +57 -57
  208. package/test/specs/{attrBinding.spec.js → attrBinding.spec.ts} +103 -106
  209. package/test/specs/{binder.spec.js → binder.spec.ts} +29 -27
  210. package/test/specs/blurBinding.spec.ts +60 -0
  211. package/test/specs/chainableUse.spec.ts +125 -0
  212. package/test/specs/clickBinding.spec.ts +194 -0
  213. package/test/specs/{cssBinding.spec.js → cssBinding.spec.ts} +72 -79
  214. package/test/specs/{dataBindBootstrap.spec.js → dataBindBootstrap.spec.ts} +332 -313
  215. package/test/specs/{filter.spec.js → filter.spec.ts} +75 -76
  216. package/test/specs/{forOfBinding.spec.js → forOfBinding.spec.ts} +208 -219
  217. package/test/specs/formBinding.spec.ts +272 -0
  218. package/test/specs/ifBinding.spec.ts +165 -0
  219. package/test/specs/{nestedComponent.spec.js → nestedComponent.spec.ts} +88 -88
  220. package/test/specs/reactiveProxy.spec.ts +465 -0
  221. package/test/specs/{showBinding.spec.js → showBinding.spec.ts} +148 -149
  222. package/test/specs/{switchBinding.spec.js → switchBinding.spec.ts} +172 -173
  223. package/test/specs/templateBinding.spec.ts +273 -0
  224. package/test/specs/{textBinding.spec.js → textBinding.spec.ts} +47 -48
  225. package/test/tsconfig.json +31 -0
  226. package/test-output.txt +200 -0
  227. package/test-reactive.html +224 -0
  228. package/tsconfig.json +28 -0
  229. package/vendors/lodash.custom.js +4577 -4577
  230. package/vendors/lodash.custom.min.js +45 -45
  231. package/vitest.config.js +27 -0
  232. package/.eslintrc.js +0 -1
  233. package/.grunt/grunt-contrib-jasmine/boot.js +0 -161
  234. package/.grunt/grunt-contrib-jasmine/dist/js/dataBind.js +0 -9
  235. package/.grunt/grunt-contrib-jasmine/grunt-template-jasmine-istanbul/reporter.js +0 -23
  236. package/.grunt/grunt-contrib-jasmine/jasmine-html.js +0 -853
  237. package/.grunt/grunt-contrib-jasmine/jasmine.css +0 -271
  238. package/.grunt/grunt-contrib-jasmine/jasmine.js +0 -9761
  239. package/.grunt/grunt-contrib-jasmine/jasmine_favicon.png +0 -0
  240. package/.grunt/grunt-contrib-jasmine/json2.js +0 -489
  241. package/.grunt/grunt-contrib-jasmine/reporter.js +0 -107
  242. package/coverage/coverage.json +0 -1
  243. package/coverage/lcov/lcov-report/base.css +0 -213
  244. package/coverage/lcov/lcov-report/index.html +0 -93
  245. package/coverage/lcov/lcov-report/js/dataBind.js.html +0 -6596
  246. package/coverage/lcov/lcov-report/js/index.html +0 -93
  247. package/coverage/lcov/lcov-report/prettify.css +0 -1
  248. package/coverage/lcov/lcov-report/prettify.js +0 -1
  249. package/coverage/lcov/lcov-report/sort-arrow-sprite.png +0 -0
  250. package/coverage/lcov/lcov-report/sorter.js +0 -158
  251. package/coverage/lcov/lcov.info +0 -1991
  252. package/eslintrc.json +0 -40
  253. package/examples/bootstrap/js/bootstrap.min.js +0 -6
  254. package/examples/bootstrap/js/popper.min.js +0 -5
  255. package/examples/bootstrap/js/searchSuggestion.js +0 -58
  256. package/examples/bootstrap/js/typeahead.jquery.js +0 -1538
  257. package/gruntfile.js +0 -92
  258. package/gulpfile.js +0 -32
  259. package/src/binder.js +0 -422
  260. package/src/changeBinding.js +0 -57
  261. package/src/config.js +0 -65
  262. package/src/createBindingOption.js +0 -66
  263. package/src/createEventBinding.js +0 -46
  264. package/src/eventSystem.js +0 -46
  265. package/src/hoverBinding.js +0 -57
  266. package/src/index.js +0 -26
  267. package/src/renderTemplate.js +0 -128
  268. package/src/util.js +0 -648
  269. package/test/specs/blurBinding.spec.js +0 -57
  270. package/test/specs/formBinding.spec.js +0 -292
  271. package/test/specs/ifBinding.spec.js +0 -169
  272. package/test/specs/templateBinding.spec.js +0 -117
  273. package/vendors/jasmine-jquery.js +0 -841
  274. package/vendors/jquery-3.2.1.min.js +0 -4
@@ -1,292 +0,0 @@
1
- describe('Given form-component initised', () => {
2
- const getElementAttributesObj = function($el) {
3
- const obj = {};
4
- $.each($el[0].attributes, function() {
5
- if (this.specified) {
6
- obj[this.name] = this.value;
7
- }
8
- });
9
- return obj;
10
- };
11
-
12
- const formComponentVM = {
13
- title: 'form component title',
14
- description: 'form component description',
15
- carName: 'saab',
16
- showContent: false,
17
- markAllCompleted: false,
18
- gender: 'female',
19
- testDate: '2017-12-25',
20
- testRange: '1',
21
- message: 'This is message from viewModel',
22
- taskName: '',
23
- showTaskNameInput: false,
24
- testAttr: {
25
- id: 'testId',
26
- rel: 'testRel',
27
- class: 'show',
28
- },
29
- onAddTask: function(e, $element, newValue, oldValue) {
30
- this.taskName = newValue;
31
- this.updateView();
32
- },
33
- onMarkAllCompleted: function(e, $element, newValue, oldValue) {
34
- this.markAllCompleted = true;
35
- this.updateView();
36
- },
37
- onSelected: function(e, $element, newValue, oldValue) {
38
- expect(newValue).not.toBe(oldValue);
39
- },
40
- onGenderChanged: function(e, $element, newValue, oldValue) {
41
- expect(newValue).not.toBe(oldValue);
42
- },
43
- onTestDateChanged: function(e, $element, newValue, oldValue) {
44
- expect(newValue).not.toBe(oldValue);
45
- },
46
- onTestRangeChanged: function(e, $element, newValue, oldValue) {
47
- expect(newValue).not.toBe(oldValue);
48
- this.updateView();
49
- },
50
- onMessageChanged: function(e, $element, newValue, oldValue) {
51
- expect(newValue).not.toBe(oldValue);
52
- this.updateView();
53
- },
54
- onEditTask: function(e, $element) {
55
- this.showTaskNameInput = true;
56
- this.updateView();
57
- },
58
- onFocusEditTask: function(e, $element) {
59
- expect($element[0].id).toBe('taskName');
60
- },
61
- onBlurEditTask: function(e, $element) {
62
- expect($element[0].id).toBe('taskName');
63
- },
64
- onTestFormSubmit: function(e, $element, formData) {
65
- e.preventDefault();
66
- },
67
- updateView: function() {
68
- namespace.formComponentApp.render();
69
- },
70
- };
71
- const namespace = {};
72
-
73
- jasmine.getFixtures().fixturesPath = 'test';
74
-
75
- beforeEach(() => {
76
- loadFixtures('./fixtures/formBindings.html');
77
- namespace.formComponentApp = dataBind.init(document.querySelector('[data-bind-comp="form-component"]'), formComponentVM);
78
- namespace.formComponentApp.render();
79
- });
80
-
81
- afterEach(() => {
82
- // clean up app
83
- delete namespace.formComponentApp;
84
- });
85
-
86
- it('Then each bond input element should updated according to viewModel', (done) => {
87
- // check on next tick because dataBind.render is aysn
88
- setTimeout(() => {
89
- expect($('#test-form-title').text()).toBe(formComponentVM.title);
90
- expect($('#test-form-description').text()).toBe(formComponentVM.description);
91
- expect($('#test-form-description').is(':visible')).toBe(formComponentVM.showContent);
92
- expect($('#toggle-all').is(':checked')).toBe(formComponentVM.markAllCompleted);
93
- expect($('input[name="gender"]:checked').val()).toBe(formComponentVM.gender);
94
- expect($('#carName').val()).toBe(formComponentVM.carName);
95
- expect($('#testDate').val()).toBe(formComponentVM.testDate);
96
- expect($('#testRange').val()).toBe(formComponentVM.testRange);
97
- expect($('#testRangeLabel').text()).toBe($('#testRange').val());
98
- expect($('#taskName').val()).toBe(formComponentVM.taskName);
99
- expect($('#taskName').is(':visible')).toBe(formComponentVM.showTaskNameInput);
100
- done();
101
- }, 200);
102
- });
103
-
104
- it('When change #new-todo input value then viewModel should have updated', (done) => {
105
- const task1 = 'new test task';
106
- setTimeout(function() {
107
- const $newTodo = document.getElementById('new-todo');
108
- const evt = document.createEvent('HTMLEvents');
109
-
110
- evt.initEvent('change', true, true);
111
- $newTodo.value = task1;
112
- $newTodo.dispatchEvent(evt);
113
-
114
- // defer to check after asyn render
115
- setTimeout(function() {
116
- expect(formComponentVM.taskName).toBe(task1);
117
- expect($('#taskName').val()).toBe(formComponentVM.taskName);
118
- done();
119
- }, 100);
120
- }, 100);
121
- });
122
-
123
- it('When #toggle-all checked then viewModel should have updated', (done) => {
124
- setTimeout(() => {
125
- const $toggleAll = document.getElementById('toggle-all');
126
- const evt = document.createEvent('HTMLEvents');
127
-
128
- evt.initEvent('change', true, true);
129
- $toggleAll.checked = true;
130
- $toggleAll.dispatchEvent(evt);
131
-
132
- // defer to check after asyn render
133
- setTimeout(() => {
134
- expect(formComponentVM.markAllCompleted).toBe(true);
135
- done();
136
- }, 100);
137
- }, 100);
138
- });
139
-
140
- it('When #carName dropdwon changed then viewModel should have updated', (done) => {
141
- const newCarName = 'audi';
142
-
143
- setTimeout(() => {
144
- const $carName = document.getElementById('carName');
145
- const evt = document.createEvent('HTMLEvents');
146
-
147
- evt.initEvent('change', true, true);
148
- $carName.value = newCarName;
149
- $carName.dispatchEvent(evt);
150
-
151
- // defer to check after asyn render
152
- setTimeout(() => {
153
- expect(formComponentVM.carName).toBe(newCarName);
154
- done();
155
- }, 100);
156
- }, 100);
157
- });
158
-
159
- it('When #radioMale changed then viewModel should have updated', (done) => {
160
- const newGender = 'male';
161
-
162
- setTimeout(() => {
163
- const radioMale = document.getElementById('radioMale');
164
- const evt = document.createEvent('HTMLEvents');
165
-
166
- evt.initEvent('change', true, true);
167
- radioMale.checked = true;
168
- radioMale.dispatchEvent(evt);
169
-
170
- // defer to check after asyn render
171
- setTimeout(() => {
172
- expect(formComponentVM.gender).toBe(newGender);
173
- done();
174
- }, 100);
175
- }, 100);
176
- });
177
-
178
- it('When #testDate date input changed then viewModel should have updated', (done) => {
179
- const newTestDate = '2018-01-01';
180
-
181
- setTimeout(() => {
182
- const $testDate = document.getElementById('testDate');
183
- const evt = document.createEvent('HTMLEvents');
184
-
185
- evt.initEvent('change', true, true);
186
- $testDate.value = newTestDate;
187
- $testDate.dispatchEvent(evt);
188
-
189
- // defer to check after asyn render
190
- setTimeout(() => {
191
- expect(formComponentVM.testDate).toBe(newTestDate);
192
- done();
193
- }, 100);
194
- }, 100);
195
- });
196
-
197
- it('When #testRange range input changed then viewModel should have updated', (done) => {
198
- const newTestRange = '3';
199
-
200
- setTimeout(() => {
201
- const $testRange = document.getElementById('testRange');
202
- const evt = document.createEvent('HTMLEvents');
203
-
204
- evt.initEvent('change', true, true);
205
- $testRange.value = newTestRange;
206
- $testRange.dispatchEvent(evt);
207
-
208
- // defer to check after asyn render
209
- setTimeout(() => {
210
- expect(formComponentVM.testRange).toBe(newTestRange);
211
- expect($('#testRangeLabel').text()).toBe(newTestRange);
212
- done();
213
- }, 100);
214
- }, 100);
215
- });
216
-
217
- it('When #message range input changed with xss html then viewModel data should have escaped value and updated', (done) => {
218
- const newMessage = 'This is a new message for test <script>alert(xss)</script>';
219
-
220
- const escapedMessage = 'This is a new message for test &lt;script&gt;alert(xss)&lt;/script&gt;';
221
-
222
- setTimeout(() => {
223
- const $message = document.getElementById('message');
224
- const evt = document.createEvent('HTMLEvents');
225
-
226
- evt.initEvent('change', true, true);
227
- $message.value = newMessage;
228
- $message.dispatchEvent(evt);
229
-
230
- // defer to check after asyn render
231
- setTimeout(() => {
232
- expect(formComponentVM.message).toBe(escapedMessage);
233
- done();
234
- }, 100);
235
- }, 100);
236
- });
237
-
238
- it('When #labelTaskeName label double clicked then viewModel should have updated and #taskName should show', (done) => {
239
- const $labelTaskeName = document.getElementById('labelTaskeName');
240
- const evtDblclick = document.createEvent('MouseEvents');
241
- const evtChange = document.createEvent('HTMLEvents');
242
-
243
- evtDblclick.initEvent('dblclick', true, true);
244
- evtChange.initEvent('change', true, true);
245
-
246
- $labelTaskeName.dispatchEvent(evtDblclick);
247
- $labelTaskeName.dispatchEvent(evtChange);
248
-
249
- // defer to check after asyn render
250
- setTimeout(() => {
251
- const $taskName = document.getElementById('taskName');
252
-
253
- expect($('#taskName').is(':visible')).toBe(formComponentVM.showTaskNameInput);
254
-
255
- $taskName.focus();
256
- $taskName.blur();
257
- done();
258
- }, 100);
259
- });
260
-
261
- describe('Element with attribute binding', () => {
262
- it('should display attribute from viewModel', (done) => {
263
- const $el = $('[data-bind-attr="testAttr"]');
264
- let attrObj = {};
265
- setTimeout(() => {
266
- attrObj = getElementAttributesObj($el);
267
- $.each(formComponentVM.testAttr, function(k, v) {
268
- expect(attrObj[k]).toBe(v);
269
- });
270
- done();
271
- }, 100);
272
- });
273
-
274
- it('should update attribute according to viewModel', (done) => {
275
- const $el = $('[data-bind-attr="testAttr"]');
276
- let attrObj = {};
277
- formComponentVM.testAttr = {
278
- id: '8888',
279
- class: 'hidden',
280
- };
281
- formComponentVM.updateView();
282
- setTimeout(() => {
283
- attrObj = getElementAttributesObj($el);
284
- $.each(formComponentVM.testAttr, function(k, v) {
285
- expect(attrObj[k]).toBe(v);
286
- });
287
- expect(attrObj.rel).toBeUndefined();
288
- done();
289
- }, 100);
290
- });
291
- });
292
- });
@@ -1,169 +0,0 @@
1
- /* eslint-disable max-len */
2
- describe('Given [data-bind-comp="if-component"] inited', () => {
3
- const namespace = {};
4
-
5
- jasmine.getFixtures().fixturesPath = 'test';
6
-
7
- beforeEach(function() {
8
- loadFixtures('./fixtures/ifBinding.html');
9
-
10
- namespace.viewModel = {
11
- renderIntro: true,
12
- heading: 'Test data-if-binding',
13
- description: 'This is intro text',
14
- story: {
15
- title: 'Hansel and Gretel',
16
- description:
17
- '"Hansel and Gretel" (also known as Hansel and Grettel, Hansel and Grethel, or Little Brother and Little Sister) is a well-known fairy tale of German origin.',
18
- link: 'https://www.google.com.au/search?q=Hansel+and+Gretel',
19
- },
20
- viewModelPropFn: function($data) {
21
- return typeof $data.viewModelPropFn === 'function';
22
- },
23
- undefinedViewModelPropFn: function($data) {
24
- return;
25
- },
26
- setStroylinkAttr: function($data) {
27
- return {
28
- href: this.story.link,
29
- title: this.story.title,
30
- target: '_blank',
31
- rel: 'noopener noreferrer',
32
- };
33
- },
34
- onStoryClick: function(e, $el) {
35
- e.preventDefault();
36
- },
37
- updateView: function(opt) {
38
- this.APP.render(opt);
39
- },
40
- };
41
-
42
- namespace.myIfComponent = dataBind.init(document.querySelector('[data-bind-comp="if-component"]'), namespace.viewModel);
43
-
44
- namespace.myIfComponent.render();
45
-
46
- // jasmine spies
47
- spyOn(namespace.viewModel, 'onStoryClick');
48
- });
49
-
50
- afterEach(() => {
51
- // clean up all app/components
52
- for (const prop in namespace) {
53
- if (namespace.hasOwnProperty(prop)) {
54
- delete namespace[prop];
55
- }
56
- }
57
- });
58
-
59
- it('Then [data-bind-comp="myIfComponent"] should have render', (done) => {
60
- setTimeout(() => {
61
- expect($('#intro-heading').text()).toBe(namespace.viewModel.heading);
62
- expect($('#intro-description').text()).toBe(namespace.viewModel.description);
63
- done();
64
- }, 200);
65
- });
66
-
67
- it('Then render if-binding elements with comment tag wrap around', (done) => {
68
- setTimeout(() => {
69
- const introOpenCommentWrap = document.getElementById('intro').previousSibling;
70
- const introCloseCommentWrap = document.getElementById('intro').nextSibling;
71
-
72
- expect(introOpenCommentWrap.nodeType).toBe(8);
73
- expect(introCloseCommentWrap.nodeType).toBe(8);
74
- expect(introOpenCommentWrap.textContent).toContain('data-if');
75
- expect(introCloseCommentWrap.textContent).toContain('data-if');
76
- done();
77
- }, 200);
78
- });
79
-
80
- it('should not render #story ', (done) => {
81
- setTimeout(() => {
82
- expect($('#story').length).toBe(0);
83
- done();
84
- }, 200);
85
- });
86
-
87
- it('should not render #testPropFn ', (done) => {
88
- setTimeout(() => {
89
- expect(document.getElementById('testPropFn')).not.toBe(null);
90
- done();
91
- }, 200);
92
- });
93
-
94
- it('should not render #testUnDefiniedProp ', (done) => {
95
- setTimeout(() => {
96
- expect(document.getElementById('testUnDefiniedProp')).toBe(null);
97
- done();
98
- }, 200);
99
- });
100
-
101
- it('should render inverse negated boolean block', (done) => {
102
- setTimeout(() => {
103
- expect(document.getElementById('NotTestUnDefiniedProp')).not.toBe(null);
104
- done();
105
- }, 200);
106
- });
107
-
108
- describe('When update viewModel renderIntro to false', () => {
109
- it('should render story and remove intro', (done) => {
110
- namespace.viewModel.renderIntro = false;
111
- namespace.viewModel.updateView();
112
-
113
- setTimeout(() => {
114
- expect($('#story').length).toBe(1);
115
- expect($('#intro').length).toBe(0);
116
- expect($('#storyIntroHeading').text()).toBe(namespace.viewModel.story.title);
117
- expect($('#storyDescription').text()).toBe(namespace.viewModel.story.description);
118
- expect($('#storyLink').attr('href')).toBe(namespace.viewModel.story.link);
119
- expect($('#storyLink').attr('title')).toBe(namespace.viewModel.story.title);
120
- expect($('#storyLink').attr('target')).toBe('_blank');
121
- expect($('#storyLink').attr('rel')).toBe('noopener noreferrer');
122
-
123
- const evt = document.createEvent('HTMLEvents');
124
- evt.initEvent('click', true, true);
125
-
126
- const $searchInput = document.getElementById('storyLink');
127
- $searchInput.dispatchEvent(evt);
128
-
129
- expect(namespace.viewModel.onStoryClick).toHaveBeenCalled();
130
- namespace.viewModel.onStoryClick.calls.reset();
131
- done();
132
- }, 200);
133
- });
134
- });
135
-
136
- describe('When update viewModel renderIntro to true', () => {
137
- it('should render intro and remove story', (done) => {
138
- namespace.viewModel.renderIntro = true;
139
- namespace.viewModel.updateView();
140
-
141
- setTimeout(() => {
142
- expect($('#story').length).toBe(0);
143
- expect($('#intro').length).toBe(1);
144
- done();
145
- }, 200);
146
- });
147
- });
148
-
149
- describe('When update viewModel renderIntro to false again', () => {
150
- it('should render story and event handler rebind', (done) => {
151
- namespace.viewModel.renderIntro = false;
152
- namespace.viewModel.updateView();
153
-
154
- setTimeout(() => {
155
- const $storyLink = document.getElementById('storyLink');
156
- const evt = document.createEvent('HTMLEvents');
157
- evt.initEvent('click', true, true);
158
-
159
- expect($('#story').length).toBe(1);
160
- expect($('#intro').length).toBe(0);
161
-
162
- $storyLink.dispatchEvent(evt);
163
- expect(namespace.viewModel.onStoryClick).toHaveBeenCalled();
164
- namespace.viewModel.onStoryClick.calls.reset();
165
- done();
166
- }, 200);
167
- });
168
- });
169
- });
@@ -1,117 +0,0 @@
1
- describe('Given [data-bind-comp="temp-component"] inited', () => {
2
- const namespace = {};
3
-
4
- jasmine.getFixtures().fixturesPath = 'test';
5
-
6
- beforeEach(function() {
7
- loadFixtures('./fixtures/templateBinding.html');
8
-
9
- namespace.finishTemplateRender = 0;
10
-
11
- namespace.viewModel = {
12
- heading: 'Test data-bind-temp binding',
13
- description: 'This is template binding that also support underscore syntax',
14
- content: 'test text',
15
- contentNest1: {
16
- info: 'Nested content 1',
17
- },
18
- contentNest2: {
19
- info: 'Nested content 2',
20
- },
21
- contentNest3: {
22
- info: 'Nested content 3',
23
- },
24
- afterTemplateRender: function() {
25
- namespace.finishTemplateRender += 1;
26
- },
27
- updateView: function(opt) {
28
- this.APP.render(opt);
29
- },
30
- };
31
-
32
- namespace.myComponent = dataBind.init(document.querySelector('[data-bind-comp="temp-component"]'), namespace.viewModel);
33
-
34
- namespace.myComponent.render();
35
- });
36
-
37
- afterEach(() => {
38
- // clean up all app/components
39
- for (const prop in namespace) {
40
- if (namespace.hasOwnProperty(prop)) {
41
- delete namespace[prop];
42
- }
43
- }
44
- });
45
-
46
- it('Then [data-bind-comp="temp-component"] should have render', (done) => {
47
- setTimeout(() => {
48
- expect(document.getElementById('heading').textContent).toBe(namespace.viewModel.heading);
49
- expect(namespace.finishTemplateRender).toBe(1);
50
- done();
51
- }, 200);
52
- });
53
-
54
- it('Should render template1 with viewModel data', (done) => {
55
- setTimeout(() => {
56
- const viewModel = namespace.viewModel;
57
- const $compSection = document.getElementById('compSection');
58
- const $heading = document.getElementById('heading');
59
- const $description = document.getElementById('description');
60
- const $content = document.getElementById('content');
61
- const $contentNest1 = document.getElementById('contentNest1');
62
-
63
- expect($compSection.children.length).not.toBe(0);
64
- expect($heading.textContent).toBe(viewModel.heading);
65
- expect($description.textContent).toBe(viewModel.description);
66
- expect($content.textContent).toBe(viewModel.content);
67
- expect($contentNest1.children.length).not.toBe(0);
68
- done();
69
- }, 200);
70
- });
71
-
72
- it('Should render nested templates with standard dataBindings', (done) => {
73
- setTimeout(() => {
74
- const viewModel = namespace.viewModel;
75
- const $contentNest1 = document.getElementById('contentNest1');
76
- const $contentNest1Info = document.getElementById('contentNest1Info');
77
- const $nestPrepend = document.getElementById('nestPrepend');
78
- const $nestAppend = document.getElementById('nestAppend');
79
-
80
- expect($contentNest1.children.length).not.toBe(0);
81
- expect($contentNest1Info.textContent).toBe(viewModel.contentNest1.info);
82
- expect($nestPrepend.children.length).toBeGreaterThan(1);
83
- expect($nestAppend.children.length).toBeGreaterThan(1);
84
- done();
85
- }, 200);
86
- });
87
-
88
- it('Should render nested template prepend option', (done) => {
89
- setTimeout(() => {
90
- const viewModel = namespace.viewModel;
91
- const $nestPrepend = document.getElementById('nestPrepend');
92
- const $nestPrependHeading = document.getElementById('nestPrependHeading');
93
- const $contentNest2Info = document.getElementById('contentNest2Info');
94
-
95
- expect($nestPrepend.children.length).toBeGreaterThan(1);
96
- expect($nestPrependHeading).not.toBe(null);
97
- expect($nestPrependHeading.previousElementSibling).toBe(contentNest2Info);
98
- expect($contentNest2Info.textContent).toBe(viewModel.contentNest2.info);
99
- done();
100
- }, 200);
101
- });
102
-
103
- it('Should render nested template append option', (done) => {
104
- setTimeout(() => {
105
- const viewModel = namespace.viewModel;
106
- const $nestAppend = document.getElementById('nestAppend');
107
- const $nestAppendHeading = document.getElementById('nestAppendHeading');
108
- const $contentNest3Info = document.getElementById('contentNest3Info');
109
-
110
- expect($nestAppend.children.length).toBeGreaterThan(1);
111
- expect($nestAppendHeading).not.toBe(null);
112
- expect($nestAppendHeading.nextElementSibling).toBe(contentNest3Info);
113
- expect($contentNest3Info.textContent).toBe(viewModel.contentNest3.info);
114
- done();
115
- }, 200);
116
- });
117
- });