@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,316 +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
- onTestRangeInputChange: function(e, $element, newValue, oldValue) {
51
- expect(newValue).not.toBe(oldValue);
52
- this.updateView();
53
- },
54
- onMessageChanged: function(e, $element, newValue, oldValue) {
55
- expect(newValue).not.toBe(oldValue);
56
- this.updateView();
57
- },
58
- onEditTask: function(e, $element) {
59
- this.showTaskNameInput = true;
60
- this.updateView();
61
- },
62
- onFocusEditTask: function(e, $element) {
63
- expect($element[0].id).toBe('taskName');
64
- },
65
- onBlurEditTask: function(e, $element) {
66
- expect($element[0].id).toBe('taskName');
67
- },
68
- onTestFormSubmit: function(e, $element, formData) {
69
- e.preventDefault();
70
- },
71
- updateView: function() {
72
- namespace.formComponentApp.render();
73
- },
74
- };
75
- const namespace = {};
76
-
77
- jasmine.getFixtures().fixturesPath = 'test';
78
-
79
- beforeEach(() => {
80
- loadFixtures('./fixtures/formBindings.html');
81
- namespace.formComponentApp = dataBind.init(document.querySelector('[data-bind-comp="form-component"]'), formComponentVM);
82
- namespace.formComponentApp.render();
83
- });
84
-
85
- afterEach(() => {
86
- // clean up app
87
- delete namespace.formComponentApp;
88
- });
89
-
90
- it('Then each bond input element should updated according to viewModel', (done) => {
91
- // check on next tick because dataBind.render is aysn
92
- setTimeout(() => {
93
- expect($('#test-form-title').text()).toBe(formComponentVM.title);
94
- expect($('#test-form-description').text()).toBe(formComponentVM.description);
95
- expect($('#test-form-description').is(':visible')).toBe(formComponentVM.showContent);
96
- expect($('#toggle-all').is(':checked')).toBe(formComponentVM.markAllCompleted);
97
- expect($('input[name="gender"]:checked').val()).toBe(formComponentVM.gender);
98
- expect($('#carName').val()).toBe(formComponentVM.carName);
99
- expect($('#testDate').val()).toBe(formComponentVM.testDate);
100
- expect($('#testRange').val()).toBe(formComponentVM.testRange);
101
- expect($('#testRangeLabel').text()).toBe($('#testRange').val());
102
- expect($('#taskName').val()).toBe(formComponentVM.taskName);
103
- expect($('#taskName').is(':visible')).toBe(formComponentVM.showTaskNameInput);
104
- done();
105
- }, 200);
106
- });
107
-
108
- it('When change #new-todo input value then viewModel should have updated', (done) => {
109
- const task1 = 'new test task';
110
- setTimeout(function() {
111
- const $newTodo = document.getElementById('new-todo');
112
- const evt = document.createEvent('HTMLEvents');
113
-
114
- evt.initEvent('change', true, true);
115
- $newTodo.value = task1;
116
- $newTodo.dispatchEvent(evt);
117
-
118
- // defer to check after asyn render
119
- setTimeout(function() {
120
- expect(formComponentVM.taskName).toBe(task1);
121
- expect($('#taskName').val()).toBe(formComponentVM.taskName);
122
- done();
123
- }, 100);
124
- }, 100);
125
- });
126
-
127
- it('When #toggle-all checked then viewModel should have updated', (done) => {
128
- setTimeout(() => {
129
- const $toggleAll = document.getElementById('toggle-all');
130
- const evt = document.createEvent('HTMLEvents');
131
-
132
- evt.initEvent('change', true, true);
133
- $toggleAll.checked = true;
134
- $toggleAll.dispatchEvent(evt);
135
-
136
- // defer to check after asyn render
137
- setTimeout(() => {
138
- expect(formComponentVM.markAllCompleted).toBe(true);
139
- done();
140
- }, 100);
141
- }, 100);
142
- });
143
-
144
- it('When #carName dropdwon changed then viewModel should have updated', (done) => {
145
- const newCarName = 'audi';
146
-
147
- setTimeout(() => {
148
- const $carName = document.getElementById('carName');
149
- const evt = document.createEvent('HTMLEvents');
150
-
151
- evt.initEvent('change', true, true);
152
- $carName.value = newCarName;
153
- $carName.dispatchEvent(evt);
154
-
155
- // defer to check after asyn render
156
- setTimeout(() => {
157
- expect(formComponentVM.carName).toBe(newCarName);
158
- done();
159
- }, 100);
160
- }, 100);
161
- });
162
-
163
- it('When #radioMale changed then viewModel should have updated', (done) => {
164
- const newGender = 'male';
165
-
166
- setTimeout(() => {
167
- const radioMale = document.getElementById('radioMale');
168
- const evt = document.createEvent('HTMLEvents');
169
-
170
- evt.initEvent('change', true, true);
171
- radioMale.checked = true;
172
- radioMale.dispatchEvent(evt);
173
-
174
- // defer to check after asyn render
175
- setTimeout(() => {
176
- expect(formComponentVM.gender).toBe(newGender);
177
- done();
178
- }, 100);
179
- }, 100);
180
- });
181
-
182
- it('When #testDate date input changed then viewModel should have updated', (done) => {
183
- const newTestDate = '2018-01-01';
184
-
185
- setTimeout(() => {
186
- const $testDate = document.getElementById('testDate');
187
- const evt = document.createEvent('HTMLEvents');
188
-
189
- evt.initEvent('change', true, true);
190
- $testDate.value = newTestDate;
191
- $testDate.dispatchEvent(evt);
192
-
193
- // defer to check after asyn render
194
- setTimeout(() => {
195
- expect(formComponentVM.testDate).toBe(newTestDate);
196
- done();
197
- }, 100);
198
- }, 100);
199
- });
200
-
201
- it('When #testRange range input changed then viewModel should have updated', (done) => {
202
- const newTestRange = '3';
203
-
204
- setTimeout(() => {
205
- const $testRange = document.getElementById('testRange');
206
- const evt = document.createEvent('HTMLEvents');
207
-
208
- evt.initEvent('change', true, true);
209
- $testRange.value = newTestRange;
210
- $testRange.dispatchEvent(evt);
211
-
212
- // defer to check after asyn render
213
- setTimeout(() => {
214
- expect(formComponentVM.testRange).toBe(newTestRange);
215
- expect($('#testRangeLabel').text()).toBe(newTestRange);
216
- done();
217
- }, 100);
218
- }, 100);
219
- });
220
-
221
- it('When #testRange range input trigger onInput changed then viewModel should have updated', (done) => {
222
- const newTestRange = '2';
223
-
224
- setTimeout(() => {
225
- const $testRange = document.getElementById('testRange');
226
- const evt = document.createEvent('HTMLEvents');
227
-
228
- evt.initEvent('input', true, true);
229
- $testRange.value = newTestRange;
230
- $testRange.dispatchEvent(evt);
231
-
232
- // defer to check after asyn render
233
- setTimeout(() => {
234
- expect(formComponentVM.testRange).toBe(newTestRange);
235
- expect($('#testRangeLabel').text()).toBe(newTestRange);
236
- done();
237
- }, 100);
238
- }, 100);
239
- });
240
-
241
- it('When #message range input changed with xss html then viewModel data should have escaped value and updated', (done) => {
242
- const newMessage = 'This is a new message for test <script>alert(xss)</script>';
243
-
244
- const escapedMessage = 'This is a new message for test &lt;script&gt;alert(xss)&lt;/script&gt;';
245
-
246
- setTimeout(() => {
247
- const $message = document.getElementById('message');
248
- const evt = document.createEvent('HTMLEvents');
249
-
250
- evt.initEvent('change', true, true);
251
- $message.value = newMessage;
252
- $message.dispatchEvent(evt);
253
-
254
- // defer to check after asyn render
255
- setTimeout(() => {
256
- expect(formComponentVM.message).toBe(escapedMessage);
257
- done();
258
- }, 100);
259
- }, 100);
260
- });
261
-
262
- it('When #labelTaskeName label double clicked then viewModel should have updated and #taskName should show', (done) => {
263
- const $labelTaskeName = document.getElementById('labelTaskeName');
264
- const evtDblclick = document.createEvent('MouseEvents');
265
- const evtChange = document.createEvent('HTMLEvents');
266
-
267
- evtDblclick.initEvent('dblclick', true, true);
268
- evtChange.initEvent('change', true, true);
269
-
270
- $labelTaskeName.dispatchEvent(evtDblclick);
271
- $labelTaskeName.dispatchEvent(evtChange);
272
-
273
- // defer to check after asyn render
274
- setTimeout(() => {
275
- const $taskName = document.getElementById('taskName');
276
-
277
- expect($('#taskName').is(':visible')).toBe(formComponentVM.showTaskNameInput);
278
-
279
- $taskName.focus();
280
- $taskName.blur();
281
- done();
282
- }, 100);
283
- });
284
-
285
- describe('Element with attribute binding', () => {
286
- it('should display attribute from viewModel', (done) => {
287
- const $el = $('[data-bind-attr="testAttr"]');
288
- let attrObj = {};
289
- setTimeout(() => {
290
- attrObj = getElementAttributesObj($el);
291
- $.each(formComponentVM.testAttr, function(k, v) {
292
- expect(attrObj[k]).toBe(v);
293
- });
294
- done();
295
- }, 100);
296
- });
297
-
298
- it('should update attribute according to viewModel', (done) => {
299
- const $el = $('[data-bind-attr="testAttr"]');
300
- let attrObj = {};
301
- formComponentVM.testAttr = {
302
- id: '8888',
303
- class: 'hidden',
304
- };
305
- formComponentVM.updateView();
306
- setTimeout(() => {
307
- attrObj = getElementAttributesObj($el);
308
- $.each(formComponentVM.testAttr, function(k, v) {
309
- expect(attrObj[k]).toBe(v);
310
- });
311
- expect(attrObj.rel).toBeUndefined();
312
- done();
313
- }, 100);
314
- });
315
- });
316
- });
@@ -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
- });