@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
package/package.json CHANGED
@@ -1,13 +1,18 @@
1
1
  {
2
2
  "name": "@gogocat/data-bind",
3
- "version": "1.11.0",
3
+ "version": "2.0.0",
4
4
  "description": "dataBind is a small and fast MVVM tool for building front-end web",
5
5
  "main": "dist/js/dataBind.js",
6
+ "types": "dist/js/types/index.d.ts",
7
+ "type": "module",
6
8
  "scripts": {
7
- "test": "grunt test --force",
8
- "build": "rollup -c && gulp",
9
+ "test": "vitest run",
10
+ "test:watch": "vitest",
11
+ "test:coverage": "vitest run --coverage",
12
+ "build": "npm run lint && rollup -c",
9
13
  "watch": "rollup -c -w",
10
- "lint": "eslint src/**/*.js --fix"
14
+ "typecheck": "tsc --noEmit",
15
+ "lint": "eslint src test --fix"
11
16
  },
12
17
  "repository": {
13
18
  "type": "git",
@@ -25,35 +30,27 @@
25
30
  },
26
31
  "homepage": "https://gogocat.github.io/dataBind/",
27
32
  "devDependencies": {
28
- "@babel/cli": "^7.14.8",
29
- "@babel/core": "^7.15.0",
30
- "@babel/plugin-transform-object-assign": "^7.14.5",
31
- "@babel/preset-env": "^7.15.0",
32
- "@rollup/plugin-babel": "^5.3.0",
33
- "@rollup/plugin-commonjs": "^20.0.0",
34
- "babel-eslint": "^10.1.0",
35
- "babel-plugin-transform-es3-member-expression-literals": "^6.22.0",
36
- "babel-plugin-transform-es3-property-literals": "^6.22.0",
37
- "eslint": "^7.32.0",
38
- "eslint-config-google": "^0.14.0",
39
- "eslint-plugin-import": "^2.23.4",
40
- "eslint-plugin-node": "^11.1.0",
41
- "eslint-plugin-promise": "^5.1.0",
42
- "grunt": "^1.4.1",
43
- "grunt-cli": "^1.4.3",
44
- "grunt-contrib-connect": "^3.0.0",
45
- "grunt-contrib-jasmine": "^3.0.0",
46
- "grunt-open": "^0.2.4",
47
- "grunt-template-jasmine-istanbul": "^0.5.0",
48
- "gulp": "^4.0.2",
49
- "gulp-rename": "^2.0.0",
50
- "gulp-replace": "^1.1.3",
51
- "gulp-sourcemaps": "^3.0.0",
52
- "gulp-uglify-es": "^3.0.0",
53
- "jasmine-core": "^3.8.0",
54
- "prettier-eslint": "^13.0.0",
55
- "rollup": "^2.56.0",
56
- "rollup-plugin-banner": "^0.2.1",
57
- "rollup-plugin-eslint": "^7.0.0"
33
+ "@babel/cli": "^7.26.4",
34
+ "@babel/core": "^7.26.0",
35
+ "@babel/plugin-transform-object-assign": "^7.25.9",
36
+ "@babel/preset-env": "^7.26.0",
37
+ "@eslint/js": "^9.17.0",
38
+ "@rollup/plugin-babel": "^6.0.4",
39
+ "@rollup/plugin-commonjs": "^28.0.1",
40
+ "@rollup/plugin-replace": "^6.0.2",
41
+ "@rollup/plugin-terser": "^0.4.4",
42
+ "@rollup/plugin-typescript": "^12.1.4",
43
+ "@testing-library/dom": "^10.4.0",
44
+ "@types/node": "^24.7.2",
45
+ "@vitest/coverage-v8": "^3.2.4",
46
+ "eslint": "^9.17.0",
47
+ "globals": "^15.14.0",
48
+ "jsdom": "^25.0.1",
49
+ "rollup": "^4.30.1",
50
+ "rollup-plugin-banner2": "^1.3.0",
51
+ "tslib": "^2.8.1",
52
+ "typescript": "^5.9.3",
53
+ "typescript-eslint": "^8.46.0",
54
+ "vitest": "^3.2.4"
58
55
  }
59
56
  }
package/rollup.config.js CHANGED
@@ -1,41 +1,84 @@
1
1
  import babel from '@rollup/plugin-babel';
2
- import {eslint} from 'rollup-plugin-eslint';
3
- import banner from 'rollup-plugin-banner';
2
+ import terser from '@rollup/plugin-terser';
3
+ import replace from '@rollup/plugin-replace';
4
+ import typescript from '@rollup/plugin-typescript';
5
+ import banner2 from 'rollup-plugin-banner2';
6
+ import { readFileSync } from 'fs';
4
7
 
5
- // eslint-disable-next-line no-unused-vars
6
- const pkg = require('./package.json');
8
+ const pkg = JSON.parse(readFileSync('./package.json', 'utf-8'));
7
9
 
8
- export default {
9
- input: 'src/index.js',
10
- output: {
11
- file: 'dist/js/dataBind.js',
12
- format: 'umd', // Browser + Node.js
13
- name: 'dataBind',
14
- sourcemap: false,
10
+ const bannerText = `/*
11
+ ${pkg.name}
12
+ version ${pkg.version}
13
+ By ${pkg.author}
14
+ link ${pkg.homepage}
15
+ license ${pkg.license}
16
+ */`;
17
+
18
+ export default [
19
+ // UMD build (unminified)
20
+ {
21
+ input: 'src/index.ts',
22
+ output: {
23
+ file: 'dist/js/dataBind.js',
24
+ format: 'umd',
25
+ name: 'dataBind',
26
+ sourcemap: false,
27
+ },
28
+ plugins: [
29
+ typescript({
30
+ tsconfig: './tsconfig.json',
31
+ declaration: true,
32
+ compilerOptions: {
33
+ outDir: './dist/js',
34
+ declarationDir: './dist/js/types',
35
+ }
36
+ }),
37
+ replace({
38
+ preventAssignment: true,
39
+ values: {
40
+ '@version@': pkg.version,
41
+ },
42
+ }),
43
+ babel({
44
+ babelHelpers: 'bundled',
45
+ extensions: ['.js', '.ts'],
46
+ }),
47
+ banner2(() => bannerText),
48
+ ],
15
49
  },
16
- plugins: [
17
- banner(
18
- '<%= pkg.name %>\n' +
19
- 'version <%= pkg.version %>\n' +
20
- 'By <%= pkg.author %>\n' +
21
- 'link <%= pkg.homepage %>\n' +
22
- 'license <%= pkg.license %>\n',
23
- ),
24
- eslint({
25
- parser: 'babel-eslint',
26
- parserOptions: {
27
- ecmaVersion: 6,
28
- ecmaFeatures: {
29
- modules: true,
50
+ // UMD build (minified)
51
+ {
52
+ input: 'src/index.ts',
53
+ output: {
54
+ file: 'dist/js/dataBind.min.js',
55
+ format: 'umd',
56
+ name: 'dataBind',
57
+ sourcemap: true,
58
+ },
59
+ plugins: [
60
+ typescript({
61
+ tsconfig: './tsconfig.json',
62
+ compilerOptions: {
63
+ outDir: './dist/js',
64
+ }
65
+ }),
66
+ replace({
67
+ preventAssignment: true,
68
+ values: {
69
+ '@version@': pkg.version,
30
70
  },
31
- },
32
- rules: {
33
- quotes: [1, 'single'],
34
- semi: [1],
35
- },
36
- }),
37
- babel({
38
- babelHelpers: 'bundled',
39
- }),
40
- ],
41
- };
71
+ }),
72
+ babel({
73
+ babelHelpers: 'bundled',
74
+ extensions: ['.js', '.ts'],
75
+ }),
76
+ terser({
77
+ format: {
78
+ comments: false,
79
+ preamble: bannerText,
80
+ },
81
+ }),
82
+ ],
83
+ },
84
+ ];
@@ -4,19 +4,19 @@
4
4
  * https://github.com/lodash/lodash/blob/master/escape.js
5
5
  */
6
6
 
7
- function baseToString(value) {
7
+ const baseToString = (value: unknown): string => {
8
8
  if (typeof value == 'string') {
9
9
  return value;
10
10
  }
11
11
  return value == null ? '' : `${value}`;
12
- }
12
+ };
13
13
 
14
14
  /** Used to match HTML entities and HTML characters. */
15
15
  const reUnescapedHtml = /[&<>"'`]/g;
16
16
  const reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
17
17
 
18
18
  /** Used to map characters to HTML entities. */
19
- const htmlEscapes = {
19
+ const htmlEscapes: Record<string, string> = {
20
20
  '&': '&amp;',
21
21
  '<': '&lt;',
22
22
  '>': '&gt;',
@@ -26,15 +26,15 @@ const htmlEscapes = {
26
26
  };
27
27
 
28
28
  /**
29
- * escapeHtmlChar
30
- * @description convert characters to HTML entities.
31
- * @private
32
- * @param {string} chr The matched character to escape.
33
- * @return {string} Returns the escaped character.
34
- */
35
- function escapeHtmlChar(chr) {
29
+ * escapeHtmlChar
30
+ * @description convert characters to HTML entities.
31
+ * @private
32
+ * @param {string} chr The matched character to escape.
33
+ * @return {string} Returns the escaped character.
34
+ */
35
+ const escapeHtmlChar = (chr: string): string => {
36
36
  return htmlEscapes[chr];
37
- }
37
+ };
38
38
 
39
39
  /**
40
40
  * Converts the characters "&", "<", ">", '"', "'", and "\`", in `string` to
@@ -42,10 +42,12 @@ function escapeHtmlChar(chr) {
42
42
  * @param {string} string
43
43
  * @return {string} string
44
44
  */
45
- export default function escape(string) {
45
+ const escape = (string: unknown): string => {
46
46
  // Reset `lastIndex` because in IE < 9 `String#replace` does not.
47
- string = baseToString(string);
48
- return (string && reHasUnescapedHtml.test(string)) ?
49
- string.replace(reUnescapedHtml, escapeHtmlChar) :
50
- string;
51
- }
47
+ const strValue = baseToString(string);
48
+ return (strValue && reHasUnescapedHtml.test(strValue)) ?
49
+ strValue.replace(reUnescapedHtml, escapeHtmlChar) :
50
+ strValue;
51
+ };
52
+
53
+ export default escape;
@@ -0,0 +1,179 @@
1
+ import hoverBinding from './hoverBinding';
2
+ import changeBinding from './changeBinding';
3
+ import modelBinding from './modelBinding';
4
+ import textBinding from './textBinding';
5
+ import showBinding from './showBinding';
6
+ import cssBinding from './cssBinding';
7
+ import attrBinding from './attrBinding';
8
+ import forOfBinding from './forOfBinding'; // depends renderForOfBinding -> this , renderIteration
9
+ import ifBinding from './ifBinding';
10
+ import switchBinding from './switchBinding';
11
+ import createEventBinding from './createEventBinding';
12
+ import type {ElementCache, UpdateOption, BindingAttrs, ViewModel, BindingCache} from './types';
13
+
14
+ interface ApplyBindingParams {
15
+ ctx: unknown;
16
+ elementCache: ElementCache;
17
+ updateOption: UpdateOption;
18
+ bindingAttrs: BindingAttrs;
19
+ viewModel: ViewModel;
20
+ }
21
+
22
+ const applyBinding = ({ctx: _ctx, elementCache, updateOption, bindingAttrs, viewModel}: ApplyBindingParams): void => {
23
+ if (!elementCache || !updateOption) {
24
+ return;
25
+ }
26
+
27
+ // the follow binding should be in order for better efficiency
28
+
29
+ // apply forOf Binding
30
+ if (updateOption.forOfBinding && elementCache[bindingAttrs.forOf] && elementCache[bindingAttrs.forOf].length) {
31
+ elementCache[bindingAttrs.forOf].forEach((cache: BindingCache) => {
32
+ forOfBinding(cache, viewModel, bindingAttrs, updateOption.forceRender);
33
+ });
34
+ }
35
+
36
+ // apply attr Binding
37
+ if (updateOption.attrBinding && elementCache[bindingAttrs.attr] && elementCache[bindingAttrs.attr].length) {
38
+ elementCache[bindingAttrs.attr].forEach((cache: BindingCache) => {
39
+ attrBinding(cache, viewModel, bindingAttrs, updateOption.forceRender);
40
+ });
41
+ }
42
+
43
+ // apply if Binding
44
+ if (updateOption.ifBinding && elementCache[bindingAttrs.if] && elementCache[bindingAttrs.if].length) {
45
+ elementCache[bindingAttrs.if].forEach((cache: BindingCache) => {
46
+ ifBinding(cache, viewModel, bindingAttrs, updateOption.forceRender);
47
+ });
48
+ }
49
+
50
+ // apply show Binding
51
+ if (updateOption.showBinding && elementCache[bindingAttrs.show] && elementCache[bindingAttrs.show].length) {
52
+ elementCache[bindingAttrs.show].forEach((cache: BindingCache) => {
53
+ showBinding(cache, viewModel, bindingAttrs, updateOption.forceRender);
54
+ });
55
+ }
56
+
57
+ // apply switch Binding
58
+ if (updateOption.switchBinding && elementCache[bindingAttrs.switch] && elementCache[bindingAttrs.switch].length) {
59
+ elementCache[bindingAttrs.switch].forEach((cache: BindingCache) => {
60
+ switchBinding(cache, viewModel, bindingAttrs, updateOption.forceRender);
61
+ });
62
+ }
63
+
64
+ // apply text binding
65
+ if (updateOption.textBinding && elementCache[bindingAttrs.text] && elementCache[bindingAttrs.text].length) {
66
+ elementCache[bindingAttrs.text].forEach((cache: BindingCache) => {
67
+ textBinding(cache, viewModel, bindingAttrs, updateOption.forceRender);
68
+ });
69
+ }
70
+
71
+ // apply cssBinding
72
+ if (updateOption.cssBinding && elementCache[bindingAttrs.css] && elementCache[bindingAttrs.css].length) {
73
+ elementCache[bindingAttrs.css].forEach((cache: BindingCache) => {
74
+ cssBinding(cache, viewModel, bindingAttrs, updateOption.forceRender);
75
+ });
76
+ }
77
+
78
+ // apply model binding
79
+ if (updateOption.modelBinding && elementCache[bindingAttrs.model] && elementCache[bindingAttrs.model].length) {
80
+ elementCache[bindingAttrs.model].forEach((cache: BindingCache) => {
81
+ modelBinding(cache, viewModel, bindingAttrs, updateOption.forceRender);
82
+ });
83
+ }
84
+
85
+ // apply change binding
86
+ if (updateOption.changeBinding && elementCache[bindingAttrs.change] && elementCache[bindingAttrs.change].length) {
87
+ elementCache[bindingAttrs.change].forEach((cache: BindingCache) => {
88
+ changeBinding({
89
+ bindingAttrs,
90
+ cache,
91
+ forceRender: updateOption.forceRender,
92
+ type: 'change',
93
+ viewModel,
94
+ });
95
+ });
96
+ }
97
+
98
+ // apply submit binding
99
+ if (updateOption.submitBinding && elementCache[bindingAttrs.submit] && elementCache[bindingAttrs.submit].length) {
100
+ elementCache[bindingAttrs.submit].forEach((cache: BindingCache) => {
101
+ createEventBinding({
102
+ cache,
103
+ forceRender: updateOption.forceRender,
104
+ type: 'submit',
105
+ viewModel,
106
+ });
107
+ });
108
+ }
109
+
110
+ // apply click binding
111
+ if (updateOption.clickBinding && elementCache[bindingAttrs.click] && elementCache[bindingAttrs.click].length) {
112
+ elementCache[bindingAttrs.click].forEach((cache: BindingCache) => {
113
+ createEventBinding({
114
+ cache,
115
+ forceRender: updateOption.forceRender,
116
+ type: 'click',
117
+ viewModel,
118
+ });
119
+ });
120
+ }
121
+
122
+ // apply double click binding
123
+ if (updateOption.dblclickBinding && elementCache[bindingAttrs.dblclick] && elementCache[bindingAttrs.dblclick].length) {
124
+ elementCache[bindingAttrs.dblclick].forEach((cache: BindingCache) => {
125
+ createEventBinding({
126
+ cache,
127
+ forceRender: updateOption.forceRender,
128
+ type: 'dblclick',
129
+ viewModel,
130
+ });
131
+ });
132
+ }
133
+
134
+ // apply blur binding
135
+ if (updateOption.blurBinding && elementCache[bindingAttrs.blur] && elementCache[bindingAttrs.blur].length) {
136
+ elementCache[bindingAttrs.blur].forEach((cache: BindingCache) => {
137
+ createEventBinding({
138
+ cache,
139
+ forceRender: updateOption.forceRender,
140
+ type: 'blur',
141
+ viewModel,
142
+ });
143
+ });
144
+ }
145
+
146
+ // apply focus binding
147
+ if (updateOption.focusBinding && elementCache[bindingAttrs.focus] && elementCache[bindingAttrs.focus].length) {
148
+ elementCache[bindingAttrs.focus].forEach((cache: BindingCache) => {
149
+ createEventBinding({
150
+ cache,
151
+ forceRender: updateOption.forceRender,
152
+ type: 'focus',
153
+ viewModel,
154
+ });
155
+ });
156
+ }
157
+
158
+ // apply hover binding
159
+ if (updateOption.hoverBinding && elementCache[bindingAttrs.hover] && elementCache[bindingAttrs.hover].length) {
160
+ elementCache[bindingAttrs.hover].forEach((cache: BindingCache) => {
161
+ hoverBinding(cache, viewModel, bindingAttrs, updateOption.forceRender);
162
+ });
163
+ }
164
+
165
+ // apply input binding - eg html range input
166
+ if (updateOption.inputBinding && elementCache[bindingAttrs.input] && elementCache[bindingAttrs.input].length) {
167
+ elementCache[bindingAttrs.input].forEach((cache: BindingCache) => {
168
+ changeBinding({
169
+ bindingAttrs,
170
+ cache,
171
+ forceRender: updateOption.forceRender,
172
+ type: 'input',
173
+ viewModel,
174
+ });
175
+ });
176
+ }
177
+ };
178
+
179
+ export default applyBinding;
@@ -7,6 +7,7 @@ import {
7
7
  parseBindingObjectString,
8
8
  each,
9
9
  } from './util';
10
+ import type {BindingCache, ViewModel, PlainObject} from './types';
10
11
 
11
12
  /**
12
13
  * attrBinding
@@ -16,7 +17,7 @@ import {
16
17
  * @param {object} viewModel
17
18
  * @param {object} bindingAttrs
18
19
  */
19
- const attrBinding = (cache = {}, viewModel) => {
20
+ const attrBinding = (cache: BindingCache = {} as BindingCache, viewModel: ViewModel, _bindingAttrs?: unknown, _forceRender?: unknown): void => {
20
21
  if (!cache.dataKey) {
21
22
  return;
22
23
  }
@@ -46,10 +47,10 @@ const attrBinding = (cache = {}, viewModel) => {
46
47
 
47
48
  if (isObjLiteralStr) {
48
49
  // resolve each value in vmAttrObj
49
- each(vmAttrObj, (key, value)=> {
50
+ each(vmAttrObj, (key: string, value: unknown) => {
50
51
  // resolve value from viewModel including $data and $root
51
52
  // from viewModel.$data or viewModel.$root
52
- vmAttrObj[key] = getViewModelPropValue(viewModel, {dataKey: value});
53
+ (vmAttrObj as PlainObject)[key] = getViewModelPropValue(viewModel, {dataKey: value, el: cache.el} as BindingCache);
53
54
  });
54
55
  }
55
56
 
@@ -58,30 +59,30 @@ const attrBinding = (cache = {}, viewModel) => {
58
59
 
59
60
  // start set element attribute - oldAttrObj is empty meaning no previous render
60
61
  if (isEmptyObject(oldAttrObj)) {
61
- each(vmAttrObj, (key, value)=> {
62
+ each(vmAttrObj, (key: string, value: unknown) => {
62
63
  if (typeof value !== 'undefined') {
63
- cache.el.setAttribute(key, value);
64
+ cache.el.setAttribute(key, String(value));
64
65
  // populate cache.elementData.viewModelPropValue for future comparison
65
- if (!isObjLiteralStr) {
66
+ if (!isObjLiteralStr && cache.elementData) {
66
67
  cache.elementData.viewModelPropValue[key] = value;
67
68
  }
68
69
  }
69
70
  });
70
71
  } else {
71
72
  // loop oldAttrObj, remove attribute not present in current vmAttrObj
72
- each(oldAttrObj, (key, value)=> {
73
- if (typeof vmAttrObj[key] === 'undefined') {
73
+ each(oldAttrObj as PlainObject, (key: string, _value: unknown) => {
74
+ if (typeof (vmAttrObj as PlainObject)[key] === 'undefined') {
74
75
  cache.el.removeAttribute(key);
75
76
  }
76
77
  });
77
78
 
78
79
  // loop vmAttrObj, set attribute not present in oldAttrObj
79
- each(vmAttrObj, (key, value)=> {
80
+ each(vmAttrObj, (key: string, value: unknown) => {
80
81
  if (typeof value !== 'undefined') {
81
- if (oldAttrObj[key] !== vmAttrObj[key]) {
82
- cache.el.setAttribute(key, vmAttrObj[key]);
82
+ if ((oldAttrObj as PlainObject)[key] !== (vmAttrObj as PlainObject)[key]) {
83
+ cache.el.setAttribute(key, String((vmAttrObj as PlainObject)[key]));
83
84
  // populate cache.elementData.viewModelPropValue for future comparison
84
- if (!isObjLiteralStr) {
85
+ if (!isObjLiteralStr && cache.elementData) {
85
86
  cache.elementData.viewModelPropValue[key] = value;
86
87
  }
87
88
  }
@@ -93,7 +94,7 @@ const attrBinding = (cache = {}, viewModel) => {
93
94
  // set viewModelPropValue for future diff comaprison
94
95
  // note: vmAttrObj is a not fully resolve object, each value is still string unresloved
95
96
  if (isObjLiteralStr) {
96
- cache.elementData.viewModelPropValue = extend({}, vmAttrObj);
97
+ cache.elementData.viewModelPropValue = extend(false, {}, vmAttrObj);
97
98
  }
98
99
  };
99
100