@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.
- package/.editorconfig +14 -14
- package/.vscode/launch.json +12 -12
- package/CONFIGURATION.md +294 -0
- package/REACTIVE_MODE.md +553 -0
- package/README.md +266 -829
- package/babel.config.json +30 -0
- package/dist/js/_escape.d.ts +14 -0
- package/dist/js/_escape.d.ts.map +1 -0
- package/dist/js/applyBinding.d.ts +11 -0
- package/dist/js/applyBinding.d.ts.map +1 -0
- package/dist/js/attrBinding.d.ts +12 -0
- package/dist/js/attrBinding.d.ts.map +1 -0
- package/dist/js/binder.d.ts +67 -0
- package/dist/js/binder.d.ts.map +1 -0
- package/dist/js/changeBinding.d.ts +19 -0
- package/dist/js/changeBinding.d.ts.map +1 -0
- package/dist/js/commentWrapper.d.ts +39 -0
- package/dist/js/commentWrapper.d.ts.map +1 -0
- package/dist/js/config.d.ts +55 -0
- package/dist/js/config.d.ts.map +1 -0
- package/dist/js/createBindingOption.d.ts +32 -0
- package/dist/js/createBindingOption.d.ts.map +1 -0
- package/dist/js/createEventBinding.d.ts +10 -0
- package/dist/js/createEventBinding.d.ts.map +1 -0
- package/dist/js/cssBinding.d.ts +15 -0
- package/dist/js/cssBinding.d.ts.map +1 -0
- package/dist/js/dataBind.js +2772 -2519
- package/dist/js/dataBind.min.js +8 -1
- package/dist/js/dataBind.min.js.map +1 -1
- package/dist/js/domWalker.d.ts +9 -0
- package/dist/js/domWalker.d.ts.map +1 -0
- package/dist/js/forOfBinding.d.ts +12 -0
- package/dist/js/forOfBinding.d.ts.map +1 -0
- package/dist/js/hoverBinding.d.ts +13 -0
- package/dist/js/hoverBinding.d.ts.map +1 -0
- package/dist/js/ifBinding.d.ts +12 -0
- package/dist/js/ifBinding.d.ts.map +1 -0
- package/dist/js/index.d.ts +10 -0
- package/dist/js/index.d.ts.map +1 -0
- package/dist/js/modelBinding.d.ts +12 -0
- package/dist/js/modelBinding.d.ts.map +1 -0
- package/dist/js/postProcess.d.ts +3 -0
- package/dist/js/postProcess.d.ts.map +1 -0
- package/dist/js/pubSub.d.ts +11 -0
- package/dist/js/pubSub.d.ts.map +1 -0
- package/dist/js/reactiveProxy.d.ts +28 -0
- package/dist/js/reactiveProxy.d.ts.map +1 -0
- package/dist/js/renderForOfBinding.d.ts +8 -0
- package/dist/js/renderForOfBinding.d.ts.map +1 -0
- package/dist/js/renderIfBinding.d.ts +22 -0
- package/dist/js/renderIfBinding.d.ts.map +1 -0
- package/dist/js/renderIteration.d.ts +16 -0
- package/dist/js/renderIteration.d.ts.map +1 -0
- package/dist/js/renderTemplate.d.ts +14 -0
- package/dist/js/renderTemplate.d.ts.map +1 -0
- package/dist/js/renderTemplatesBinding.d.ts +19 -0
- package/dist/js/renderTemplatesBinding.d.ts.map +1 -0
- package/dist/js/showBinding.d.ts +13 -0
- package/dist/js/showBinding.d.ts.map +1 -0
- package/dist/js/switchBinding.d.ts +13 -0
- package/dist/js/switchBinding.d.ts.map +1 -0
- package/dist/js/textBinding.d.ts +13 -0
- package/dist/js/textBinding.d.ts.map +1 -0
- package/dist/js/types/_escape.d.ts +14 -0
- package/dist/js/types/_escape.d.ts.map +1 -0
- package/dist/js/types/applyBinding.d.ts +11 -0
- package/dist/js/types/applyBinding.d.ts.map +1 -0
- package/dist/js/types/attrBinding.d.ts +12 -0
- package/dist/js/types/attrBinding.d.ts.map +1 -0
- package/dist/js/types/binder.d.ts +67 -0
- package/dist/js/types/binder.d.ts.map +1 -0
- package/dist/js/types/changeBinding.d.ts +19 -0
- package/dist/js/types/changeBinding.d.ts.map +1 -0
- package/dist/js/types/commentWrapper.d.ts +39 -0
- package/dist/js/types/commentWrapper.d.ts.map +1 -0
- package/dist/js/types/config.d.ts +55 -0
- package/dist/js/types/config.d.ts.map +1 -0
- package/dist/js/types/createBindingOption.d.ts +32 -0
- package/dist/js/types/createBindingOption.d.ts.map +1 -0
- package/dist/js/types/createEventBinding.d.ts +10 -0
- package/dist/js/types/createEventBinding.d.ts.map +1 -0
- package/dist/js/types/cssBinding.d.ts +15 -0
- package/dist/js/types/cssBinding.d.ts.map +1 -0
- package/dist/js/types/domWalker.d.ts +9 -0
- package/dist/js/types/domWalker.d.ts.map +1 -0
- package/dist/js/types/forOfBinding.d.ts +12 -0
- package/dist/js/types/forOfBinding.d.ts.map +1 -0
- package/dist/js/types/hoverBinding.d.ts +13 -0
- package/dist/js/types/hoverBinding.d.ts.map +1 -0
- package/dist/js/types/ifBinding.d.ts +12 -0
- package/dist/js/types/ifBinding.d.ts.map +1 -0
- package/dist/js/types/index.d.ts +10 -0
- package/dist/js/types/index.d.ts.map +1 -0
- package/dist/js/types/modelBinding.d.ts +12 -0
- package/dist/js/types/modelBinding.d.ts.map +1 -0
- package/dist/js/types/postProcess.d.ts +3 -0
- package/dist/js/types/postProcess.d.ts.map +1 -0
- package/dist/js/types/pubSub.d.ts +11 -0
- package/dist/js/types/pubSub.d.ts.map +1 -0
- package/dist/js/types/reactiveProxy.d.ts +28 -0
- package/dist/js/types/reactiveProxy.d.ts.map +1 -0
- package/dist/js/types/renderForOfBinding.d.ts +8 -0
- package/dist/js/types/renderForOfBinding.d.ts.map +1 -0
- package/dist/js/types/renderIfBinding.d.ts +22 -0
- package/dist/js/types/renderIfBinding.d.ts.map +1 -0
- package/dist/js/types/renderIteration.d.ts +16 -0
- package/dist/js/types/renderIteration.d.ts.map +1 -0
- package/dist/js/types/renderTemplate.d.ts +14 -0
- package/dist/js/types/renderTemplate.d.ts.map +1 -0
- package/dist/js/types/renderTemplatesBinding.d.ts +19 -0
- package/dist/js/types/renderTemplatesBinding.d.ts.map +1 -0
- package/dist/js/types/showBinding.d.ts +13 -0
- package/dist/js/types/showBinding.d.ts.map +1 -0
- package/dist/js/types/switchBinding.d.ts +13 -0
- package/dist/js/types/switchBinding.d.ts.map +1 -0
- package/dist/js/types/textBinding.d.ts +13 -0
- package/dist/js/types/textBinding.d.ts.map +1 -0
- package/dist/js/types/types.d.ts +111 -0
- package/dist/js/types/types.d.ts.map +1 -0
- package/dist/js/types/util.d.ts +119 -0
- package/dist/js/types/util.d.ts.map +1 -0
- package/dist/js/types.d.ts +111 -0
- package/dist/js/types.d.ts.map +1 -0
- package/dist/js/util.d.ts +119 -0
- package/dist/js/util.d.ts.map +1 -0
- package/eslint.config.js +124 -0
- package/examples/DBMONSTER_COMPARISON.md +123 -0
- package/examples/afterRenderDemo.html +119 -0
- package/examples/bootstrap/css/animate.css +1579 -1579
- package/examples/bootstrap/css/bootstrap.min.css +6 -6
- package/examples/bootstrap/css/homeservices.css +378 -390
- package/examples/bootstrap/css/open-iconic.css +511 -511
- package/examples/bootstrap/fonts/open-iconic.svg +543 -543
- package/examples/bootstrap/js/compMessageDialog.js +20 -19
- package/examples/bootstrap/js/compSearchBar.js +12 -19
- package/examples/bootstrap/js/compSearchResults.js +50 -46
- package/examples/bootstrap/js/featureAdsResult.json +65 -65
- package/examples/bootstrap/js/searchResult.json +57 -57
- package/examples/bootstrap.html +343 -332
- package/examples/css/baseTodo.css +141 -141
- package/examples/css/dbMonsterStyles.css +27 -27
- package/examples/css/indexTodo.css +374 -374
- package/examples/dbmonsterForOfReactive.html +40 -0
- package/examples/dbmonsterReact.html +19 -0
- package/examples/forOfBindingSimpleDebug.html +45 -0
- package/examples/form.html +20 -4
- package/examples/globalConfig.html +131 -0
- package/examples/js/afterRenderDemo.js +190 -0
- package/examples/js/appTodo.js +46 -46
- package/examples/js/attrBindingDemo.js +2 -2
- package/examples/js/dbMonApp.js +24 -26
- package/examples/js/dbMonAppReact.jsx +79 -0
- package/examples/js/dbMonAppReactive.js +28 -0
- package/examples/js/fiberDemo.js +4 -4
- package/examples/js/filtersDemo.js +8 -8
- package/examples/js/forOfDemo.js +7 -9
- package/examples/js/forOfDemoComplex.js +44 -17
- package/examples/js/form.js +44 -12
- package/examples/js/globalConfig.js +117 -0
- package/examples/js/ifBindingDemo.js +16 -16
- package/examples/js/reactiveDemo.js +119 -0
- package/examples/js/switchBindingDemo.js +8 -8
- package/examples/react-dbmonster/dist/bundle.js +43 -0
- package/examples/react-dbmonster/package-lock.json +537 -0
- package/examples/react-dbmonster/package.json +16 -0
- package/examples/react-dbmonster/src/index.jsx +80 -0
- package/examples/reactiveDemo.html +127 -0
- package/examples/refreshRateTest.html +75 -75
- package/index.html +841 -0
- package/package.json +31 -34
- package/rollup.config.js +79 -36
- package/src/{_escape.js → _escape.ts} +19 -17
- package/src/applyBinding.ts +179 -0
- package/src/{attrBinding.js → attrBinding.ts} +14 -13
- package/src/binder.ts +289 -0
- package/src/changeBinding.ts +93 -0
- package/src/{commentWrapper.js → commentWrapper.ts} +33 -30
- package/src/config.ts +107 -0
- package/src/createBindingOption.ts +91 -0
- package/src/createEventBinding.ts +88 -0
- package/src/{cssBinding.js → cssBinding.ts} +13 -11
- package/src/{domWalker.js → domWalker.ts} +44 -30
- package/src/{forOfBinding.js → forOfBinding.ts} +4 -3
- package/src/hoverBinding.ts +84 -0
- package/src/{ifBinding.js → ifBinding.ts} +14 -12
- package/src/index.ts +53 -0
- package/src/{modelBinding.js → modelBinding.ts} +11 -9
- package/src/postProcess.ts +22 -0
- package/src/{pubSub.js → pubSub.ts} +24 -15
- package/src/reactiveProxy.ts +285 -0
- package/src/{renderForOfBinding.js → renderForOfBinding.ts} +55 -33
- package/src/{renderIfBinding.js → renderIfBinding.ts} +45 -20
- package/src/renderIteration.ts +53 -0
- package/src/renderTemplate.ts +165 -0
- package/src/renderTemplatesBinding.ts +73 -0
- package/src/{showBinding.js → showBinding.ts} +4 -3
- package/src/{switchBinding.js → switchBinding.ts} +18 -15
- package/src/{textBinding.js → textBinding.ts} +5 -4
- package/src/types.ts +124 -0
- package/src/util.ts +810 -0
- package/test/css/reporter.css +9 -9
- package/test/fixtures/dataBindBootstrap.html +2 -2
- package/test/fixtures/formBindings.html +9 -1
- package/test/globals.d.ts +19 -0
- package/test/helpers/testHelper.js +46 -11
- package/test/mocks/featureAdsResult.json +65 -65
- package/test/mocks/searchResult.json +57 -57
- package/test/specs/{attrBinding.spec.js → attrBinding.spec.ts} +103 -106
- package/test/specs/{binder.spec.js → binder.spec.ts} +29 -27
- package/test/specs/blurBinding.spec.ts +60 -0
- package/test/specs/chainableUse.spec.ts +125 -0
- package/test/specs/clickBinding.spec.ts +194 -0
- package/test/specs/{cssBinding.spec.js → cssBinding.spec.ts} +72 -79
- package/test/specs/{dataBindBootstrap.spec.js → dataBindBootstrap.spec.ts} +332 -313
- package/test/specs/{filter.spec.js → filter.spec.ts} +75 -76
- package/test/specs/{forOfBinding.spec.js → forOfBinding.spec.ts} +208 -219
- package/test/specs/formBinding.spec.ts +272 -0
- package/test/specs/ifBinding.spec.ts +165 -0
- package/test/specs/{nestedComponent.spec.js → nestedComponent.spec.ts} +88 -88
- package/test/specs/reactiveProxy.spec.ts +465 -0
- package/test/specs/{showBinding.spec.js → showBinding.spec.ts} +148 -149
- package/test/specs/{switchBinding.spec.js → switchBinding.spec.ts} +172 -173
- package/test/specs/templateBinding.spec.ts +273 -0
- package/test/specs/{textBinding.spec.js → textBinding.spec.ts} +47 -48
- package/test/tsconfig.json +31 -0
- package/test-output.txt +200 -0
- package/test-reactive.html +224 -0
- package/tsconfig.json +28 -0
- package/vendors/lodash.custom.js +4577 -4577
- package/vendors/lodash.custom.min.js +45 -45
- package/vitest.config.js +27 -0
- package/.eslintrc.js +0 -1
- package/.grunt/grunt-contrib-jasmine/boot.js +0 -161
- package/.grunt/grunt-contrib-jasmine/dist/js/dataBind.js +0 -9
- package/.grunt/grunt-contrib-jasmine/grunt-template-jasmine-istanbul/reporter.js +0 -23
- package/.grunt/grunt-contrib-jasmine/jasmine-html.js +0 -853
- package/.grunt/grunt-contrib-jasmine/jasmine.css +0 -271
- package/.grunt/grunt-contrib-jasmine/jasmine.js +0 -9761
- package/.grunt/grunt-contrib-jasmine/jasmine_favicon.png +0 -0
- package/.grunt/grunt-contrib-jasmine/json2.js +0 -489
- package/.grunt/grunt-contrib-jasmine/reporter.js +0 -107
- package/coverage/coverage.json +0 -1
- package/coverage/lcov/lcov-report/base.css +0 -213
- package/coverage/lcov/lcov-report/index.html +0 -93
- package/coverage/lcov/lcov-report/js/dataBind.js.html +0 -6596
- package/coverage/lcov/lcov-report/js/index.html +0 -93
- package/coverage/lcov/lcov-report/prettify.css +0 -1
- package/coverage/lcov/lcov-report/prettify.js +0 -1
- package/coverage/lcov/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov/lcov-report/sorter.js +0 -158
- package/coverage/lcov/lcov.info +0 -1991
- package/eslintrc.json +0 -40
- package/examples/bootstrap/js/bootstrap.min.js +0 -6
- package/examples/bootstrap/js/popper.min.js +0 -5
- package/examples/bootstrap/js/searchSuggestion.js +0 -58
- package/examples/bootstrap/js/typeahead.jquery.js +0 -1538
- package/gruntfile.js +0 -92
- package/gulpfile.js +0 -32
- package/src/binder.js +0 -422
- package/src/changeBinding.js +0 -57
- package/src/config.js +0 -65
- package/src/createBindingOption.js +0 -66
- package/src/createEventBinding.js +0 -46
- package/src/eventSystem.js +0 -46
- package/src/hoverBinding.js +0 -57
- package/src/index.js +0 -26
- package/src/renderTemplate.js +0 -128
- package/src/util.js +0 -648
- package/test/specs/blurBinding.spec.js +0 -57
- package/test/specs/formBinding.spec.js +0 -292
- package/test/specs/ifBinding.spec.js +0 -169
- package/test/specs/templateBinding.spec.js +0 -117
- package/vendors/jasmine-jquery.js +0 -841
- package/vendors/jquery-3.2.1.min.js +0 -4
package/test/css/reporter.css
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
.jasmine-summary > .jasmine-suite {
|
|
2
|
-
display: block;
|
|
3
|
-
border-bottom: 1px solid #999;
|
|
4
|
-
padding-bottom: 1em;
|
|
5
|
-
margin-bottom: 1em;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
.jasmine-suite-detail {
|
|
9
|
-
font-size: 1.2em;
|
|
1
|
+
.jasmine-summary > .jasmine-suite {
|
|
2
|
+
display: block;
|
|
3
|
+
border-bottom: 1px solid #999;
|
|
4
|
+
padding-bottom: 1em;
|
|
5
|
+
margin-bottom: 1em;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.jasmine-suite-detail {
|
|
9
|
+
font-size: 1.2em;
|
|
10
10
|
}
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
<h4 class="text-center section-title" data-bind-text="searchResultTitle">Featured service providers</h4>
|
|
33
33
|
<div id="search-result-columns" class="card-columns" data-bind-tmp="{id: 'searchResultItem', data: '$root', append: true}">
|
|
34
34
|
<div class="card result-item" data-index="0">
|
|
35
|
-
<img class="card-img-top result-item__img" src="
|
|
35
|
+
<img class="card-img-top result-item__img" src="images/pic-home.jpg" alt="Card image">
|
|
36
36
|
<div class="card-body">
|
|
37
37
|
<h4 class="card-title">Card title that wraps to a new line</h4>
|
|
38
38
|
<p class="card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
</div>
|
|
64
64
|
|
|
65
65
|
<div class="card result-item" data-index="2">
|
|
66
|
-
<img class="card-img-top result-item__img" src="
|
|
66
|
+
<img class="card-img-top result-item__img" src="images/pic-deck.jpg" alt="Card image">
|
|
67
67
|
<div class="card-body">
|
|
68
68
|
<h4 class="card-title">Card title</h4>
|
|
69
69
|
<p class="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
|
|
@@ -29,7 +29,15 @@
|
|
|
29
29
|
</div>
|
|
30
30
|
<div>
|
|
31
31
|
<label for="testRange">Choose a range:</label>
|
|
32
|
-
<input id="testRange"
|
|
32
|
+
<input id="testRange"
|
|
33
|
+
type="range"
|
|
34
|
+
min="0"
|
|
35
|
+
max="5"
|
|
36
|
+
step="1"
|
|
37
|
+
data-bind-model="testRange"
|
|
38
|
+
data-bind-change="onTestRangeChanged"
|
|
39
|
+
data-bind-input="onTestRangeInputChange"
|
|
40
|
+
>
|
|
33
41
|
<label id="testRangeLabel" data-bind-text="testRange"></label>
|
|
34
42
|
</div>
|
|
35
43
|
<div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Global test helpers and dataBind types
|
|
2
|
+
declare global {
|
|
3
|
+
// dataBind global
|
|
4
|
+
const dataBind: {
|
|
5
|
+
init: (element: Element | null, viewModel: any) => any;
|
|
6
|
+
use: (plugin: any) => void;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
// Test helper functions
|
|
10
|
+
function loadFixture(fixturePath: string): void;
|
|
11
|
+
function simulateInput(element: HTMLElement, value: string): void;
|
|
12
|
+
function simulateClick(element: HTMLElement): void;
|
|
13
|
+
function simulateBlur(element: HTMLElement): void;
|
|
14
|
+
|
|
15
|
+
// jQuery (used in some test fixtures)
|
|
16
|
+
const $: any;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export {};
|
|
@@ -1,11 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import {afterEach} from 'vitest';
|
|
2
|
+
import {readFileSync} from 'fs';
|
|
3
|
+
import {resolve} from 'path';
|
|
4
|
+
import dataBind from '../../src/index';
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* overwrite requestAnimationFrame to use setTimeout.
|
|
8
|
+
* Otherwise sometimes unpredictable in async tests.
|
|
9
|
+
* Since request animation frame callback runs when browser decides it is free (we don't know exactly when)
|
|
10
|
+
*/
|
|
11
|
+
global.requestAnimationFrame = (fn) => {
|
|
12
|
+
return setTimeout(fn, 15);
|
|
13
|
+
};
|
|
14
|
+
global.cancelAnimationFrame = (id) => {
|
|
15
|
+
return clearTimeout(id);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// Make dataBind globally available for tests (like it was in Jasmine)
|
|
19
|
+
global.dataBind = dataBind;
|
|
20
|
+
|
|
21
|
+
// Helper function to load HTML fixtures
|
|
22
|
+
global.loadFixture = (fixturePath) => {
|
|
23
|
+
const fullPath = resolve(process.cwd(), fixturePath);
|
|
24
|
+
const html = readFileSync(fullPath, 'utf-8');
|
|
25
|
+
document.body.innerHTML = html;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// Helper functions for tests to replace jQuery
|
|
29
|
+
global.simulateInput = (element, value) => {
|
|
30
|
+
element.value = value;
|
|
31
|
+
element.dispatchEvent(new Event('input', {bubbles: true}));
|
|
32
|
+
element.dispatchEvent(new Event('change', {bubbles: true}));
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
global.simulateClick = (element) => {
|
|
36
|
+
element.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true}));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
global.simulateBlur = (element) => {
|
|
40
|
+
element.dispatchEvent(new FocusEvent('blur', {bubbles: true}));
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// Helper to clean up DOM after each test
|
|
44
|
+
afterEach(() => {
|
|
45
|
+
document.body.innerHTML = '';
|
|
46
|
+
});
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
[{
|
|
2
|
-
"id": "001",
|
|
3
|
-
"title": "Card title that wraps to a new line",
|
|
4
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
5
|
-
"image": "bootstrap/images/pic-home.jpg",
|
|
6
|
-
"bookmarked": false,
|
|
7
|
-
"numLikes": 110
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"id": "002",
|
|
11
|
-
"title": "Card title",
|
|
12
|
-
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
13
|
-
"image": "",
|
|
14
|
-
"bookmarked": false,
|
|
15
|
-
"numLikes": 9
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"id": "003",
|
|
19
|
-
"title": "Card title",
|
|
20
|
-
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
21
|
-
"image": "bootstrap/images/pic-deck.jpg",
|
|
22
|
-
"bookmarked": false,
|
|
23
|
-
"numLikes": 8
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "004",
|
|
27
|
-
"title": "Card title",
|
|
28
|
-
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
29
|
-
"image": "bootstrap/images/pic-carpenter.jpg",
|
|
30
|
-
"bookmarked": false,
|
|
31
|
-
"numLikes": 8,
|
|
32
|
-
"highlight": true
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"id": "005",
|
|
36
|
-
"title": "Card title",
|
|
37
|
-
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
38
|
-
"image": "",
|
|
39
|
-
"bookmarked": false,
|
|
40
|
-
"numLikes": 68
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"id": "006",
|
|
44
|
-
"title": "Card title that wraps to a new line",
|
|
45
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
46
|
-
"image": "bootstrap/images/pic-bathrooms.jpg",
|
|
47
|
-
"bookmarked": true,
|
|
48
|
-
"numLikes": 99
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"id": "007",
|
|
52
|
-
"title": "Card title",
|
|
53
|
-
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
54
|
-
"image": "",
|
|
55
|
-
"bookmarked": false,
|
|
56
|
-
"numLikes": 9
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"id": "008",
|
|
60
|
-
"title": "Card title",
|
|
61
|
-
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
62
|
-
"image": "bootstrap/images/pic-backyard.jpg",
|
|
63
|
-
"bookmarked": false,
|
|
64
|
-
"numLikes": 24
|
|
65
|
-
}
|
|
1
|
+
[{
|
|
2
|
+
"id": "001",
|
|
3
|
+
"title": "Card title that wraps to a new line",
|
|
4
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
5
|
+
"image": "bootstrap/images/pic-home.jpg",
|
|
6
|
+
"bookmarked": false,
|
|
7
|
+
"numLikes": 110
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "002",
|
|
11
|
+
"title": "Card title",
|
|
12
|
+
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
13
|
+
"image": "",
|
|
14
|
+
"bookmarked": false,
|
|
15
|
+
"numLikes": 9
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "003",
|
|
19
|
+
"title": "Card title",
|
|
20
|
+
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
21
|
+
"image": "bootstrap/images/pic-deck.jpg",
|
|
22
|
+
"bookmarked": false,
|
|
23
|
+
"numLikes": 8
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "004",
|
|
27
|
+
"title": "Card title",
|
|
28
|
+
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
29
|
+
"image": "bootstrap/images/pic-carpenter.jpg",
|
|
30
|
+
"bookmarked": false,
|
|
31
|
+
"numLikes": 8,
|
|
32
|
+
"highlight": true
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "005",
|
|
36
|
+
"title": "Card title",
|
|
37
|
+
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
38
|
+
"image": "",
|
|
39
|
+
"bookmarked": false,
|
|
40
|
+
"numLikes": 68
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "006",
|
|
44
|
+
"title": "Card title that wraps to a new line",
|
|
45
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
46
|
+
"image": "bootstrap/images/pic-bathrooms.jpg",
|
|
47
|
+
"bookmarked": true,
|
|
48
|
+
"numLikes": 99
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "007",
|
|
52
|
+
"title": "Card title",
|
|
53
|
+
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
54
|
+
"image": "",
|
|
55
|
+
"bookmarked": false,
|
|
56
|
+
"numLikes": 9
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "008",
|
|
60
|
+
"title": "Card title",
|
|
61
|
+
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
62
|
+
"image": "bootstrap/images/pic-backyard.jpg",
|
|
63
|
+
"bookmarked": false,
|
|
64
|
+
"numLikes": 24
|
|
65
|
+
}
|
|
66
66
|
]
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
[{
|
|
2
|
-
"id": "001",
|
|
3
|
-
"title": "Card title that wraps to a new line",
|
|
4
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
5
|
-
"image": "bootstrap/images/pic-home.jpg",
|
|
6
|
-
"bookmarked": false,
|
|
7
|
-
"numLikes": 110
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"id": "456",
|
|
11
|
-
"title": "Card title",
|
|
12
|
-
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
13
|
-
"image": "",
|
|
14
|
-
"bookmarked": false,
|
|
15
|
-
"numLikes": 8
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"id": "789",
|
|
19
|
-
"title": "Sample carpemter service",
|
|
20
|
-
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
21
|
-
"image": "bootstrap/images/pic-carpenter.jpg",
|
|
22
|
-
"bookmarked": false,
|
|
23
|
-
"numLikes": 8,
|
|
24
|
-
"highlight": true
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"id": "888",
|
|
28
|
-
"title": "Sample timber floor service",
|
|
29
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
30
|
-
"image": "bootstrap/images/pic-deck.jpg",
|
|
31
|
-
"bookmarked": false,
|
|
32
|
-
"numLikes": 8
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"id": "222",
|
|
36
|
-
"title": "Sample timber floor service",
|
|
37
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
38
|
-
"image": "",
|
|
39
|
-
"bookmarked": false,
|
|
40
|
-
"numLikes": 8
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"id": "333",
|
|
44
|
-
"title": "Sample boothroom service",
|
|
45
|
-
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
46
|
-
"image": "bootstrap/images/pic-bathrooms.jpg",
|
|
47
|
-
"bookmarked": true,
|
|
48
|
-
"numLikes": 8
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"id": "444",
|
|
52
|
-
"title": "Sample gardening service",
|
|
53
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
54
|
-
"image": "bootstrap/images/pic-backyard.jpg",
|
|
55
|
-
"bookmarked": false,
|
|
56
|
-
"numLikes": 8
|
|
57
|
-
}
|
|
1
|
+
[{
|
|
2
|
+
"id": "001",
|
|
3
|
+
"title": "Card title that wraps to a new line",
|
|
4
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
5
|
+
"image": "bootstrap/images/pic-home.jpg",
|
|
6
|
+
"bookmarked": false,
|
|
7
|
+
"numLikes": 110
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "456",
|
|
11
|
+
"title": "Card title",
|
|
12
|
+
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
13
|
+
"image": "",
|
|
14
|
+
"bookmarked": false,
|
|
15
|
+
"numLikes": 8
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "789",
|
|
19
|
+
"title": "Sample carpemter service",
|
|
20
|
+
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
21
|
+
"image": "bootstrap/images/pic-carpenter.jpg",
|
|
22
|
+
"bookmarked": false,
|
|
23
|
+
"numLikes": 8,
|
|
24
|
+
"highlight": true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "888",
|
|
28
|
+
"title": "Sample timber floor service",
|
|
29
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
30
|
+
"image": "bootstrap/images/pic-deck.jpg",
|
|
31
|
+
"bookmarked": false,
|
|
32
|
+
"numLikes": 8
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "222",
|
|
36
|
+
"title": "Sample timber floor service",
|
|
37
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
38
|
+
"image": "",
|
|
39
|
+
"bookmarked": false,
|
|
40
|
+
"numLikes": 8
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "333",
|
|
44
|
+
"title": "Sample boothroom service",
|
|
45
|
+
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
46
|
+
"image": "bootstrap/images/pic-bathrooms.jpg",
|
|
47
|
+
"bookmarked": true,
|
|
48
|
+
"numLikes": 8
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "444",
|
|
52
|
+
"title": "Sample gardening service",
|
|
53
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
54
|
+
"image": "bootstrap/images/pic-backyard.jpg",
|
|
55
|
+
"bookmarked": false,
|
|
56
|
+
"numLikes": 8
|
|
57
|
+
}
|
|
58
58
|
]
|
|
@@ -1,106 +1,103 @@
|
|
|
1
|
-
describe
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('Should update testAttr1 attributes', (
|
|
50
|
-
|
|
51
|
-
const $testAttr1 = document.getElementById('testAttr1')
|
|
52
|
-
expect($testAttr1.getAttribute('ref')).toBe(namespace.viewModel.attr1.ref);
|
|
53
|
-
expect($testAttr1.getAttribute('style')).toBe(namespace.viewModel.attr1.style);
|
|
54
|
-
// check existing attribute untouch
|
|
55
|
-
expect($testAttr1.getAttribute('id')).toBe('testAttr1');
|
|
56
|
-
expect($testAttr1.getAttribute('class')).toBe('test');
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
expect($testAttr2.getAttribute('
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
expect($testAttr1.getAttribute('
|
|
81
|
-
expect($testAttr1.getAttribute('
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
expect($testAttr1.getAttribute('
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
expect($testAttr1.getAttribute('
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}, 200);
|
|
105
|
-
});
|
|
106
|
-
});
|
|
1
|
+
import {describe, it, expect, beforeEach, afterEach} from 'vitest';
|
|
2
|
+
import {waitFor} from '@testing-library/dom';
|
|
3
|
+
|
|
4
|
+
describe('Given [data-bind-comp="attr-component"] inited', () => {
|
|
5
|
+
const namespace: any = {};
|
|
6
|
+
const testAttr2Obj = {
|
|
7
|
+
id: 'newId',
|
|
8
|
+
ref: 'newRef2',
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
loadFixture('test/fixtures/attrBinding.html');
|
|
13
|
+
|
|
14
|
+
namespace.viewModel = {
|
|
15
|
+
heading: 'Test data-if-binding',
|
|
16
|
+
attr1: {
|
|
17
|
+
style: 'width:300px',
|
|
18
|
+
ref: 'newRef',
|
|
19
|
+
},
|
|
20
|
+
attr2(_$data: any) {
|
|
21
|
+
return testAttr2Obj;
|
|
22
|
+
},
|
|
23
|
+
updateView(opt?: any) {
|
|
24
|
+
this.APP.render(opt);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
namespace.myAttrComponent = dataBind.init(document.querySelector('[data-bind-comp="attr-component"]'), namespace.viewModel);
|
|
29
|
+
|
|
30
|
+
namespace.myAttrComponent.render();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
// clean up all app/components
|
|
35
|
+
for (const prop in namespace) {
|
|
36
|
+
if (Object.prototype.hasOwnProperty.call(namespace, prop)) {
|
|
37
|
+
delete namespace[prop];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('Then [data-bind-comp="myAttrComponent"] should have render', async () => {
|
|
43
|
+
await waitFor(() => {
|
|
44
|
+
const $testAttr1 = document.getElementById('testAttr1')!;
|
|
45
|
+
expect($testAttr1.textContent).toBe(namespace.viewModel.heading);
|
|
46
|
+
}, {timeout: 500});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('Should update testAttr1 attributes', async () => {
|
|
50
|
+
await waitFor(() => {
|
|
51
|
+
const $testAttr1 = document.getElementById('testAttr1')!;
|
|
52
|
+
expect($testAttr1.getAttribute('ref')).toBe(namespace.viewModel.attr1.ref);
|
|
53
|
+
expect($testAttr1.getAttribute('style')).toBe(namespace.viewModel.attr1.style);
|
|
54
|
+
// check existing attribute untouch
|
|
55
|
+
expect($testAttr1.getAttribute('id')).toBe('testAttr1');
|
|
56
|
+
expect($testAttr1.getAttribute('class')).toBe('test');
|
|
57
|
+
}, {timeout: 500});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('Should update testAttr2 attributes as viewModel function property', async () => {
|
|
61
|
+
await waitFor(() => {
|
|
62
|
+
const $testAttr2 = document.getElementById(testAttr2Obj.id)!;
|
|
63
|
+
expect($testAttr2.getAttribute('ref')).toBe(testAttr2Obj.ref);
|
|
64
|
+
expect($testAttr2.getAttribute('id')).toBe(testAttr2Obj.id);
|
|
65
|
+
}, {timeout: 500});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('Should update attribute when viewModel updated', async () => {
|
|
69
|
+
const updatedRef = 'updatedRef';
|
|
70
|
+
const disabled = 'disabled';
|
|
71
|
+
namespace.viewModel.attr1 = {
|
|
72
|
+
ref: updatedRef,
|
|
73
|
+
disabled,
|
|
74
|
+
style: namespace.viewModel.attr1.style,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
await waitFor(() => {
|
|
78
|
+
const $testAttr1 = document.getElementById('testAttr1')!;
|
|
79
|
+
expect($testAttr1.getAttribute('ref')).toBe(updatedRef);
|
|
80
|
+
expect($testAttr1.getAttribute('disabled')).toBe(disabled);
|
|
81
|
+
expect($testAttr1.getAttribute('style')).toBe(namespace.viewModel.attr1.style);
|
|
82
|
+
// check existing attribute untouch
|
|
83
|
+
expect($testAttr1.getAttribute('id')).toBe('testAttr1');
|
|
84
|
+
expect($testAttr1.getAttribute('class')).toBe('test');
|
|
85
|
+
}, {timeout: 500});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('Should remove attribute when viewModel updated', async () => {
|
|
89
|
+
const updatedRef2 = 'updatedRef2';
|
|
90
|
+
namespace.viewModel.attr1 = {
|
|
91
|
+
ref: updatedRef2,
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
await waitFor(() => {
|
|
95
|
+
const $testAttr1 = document.getElementById('testAttr1')!;
|
|
96
|
+
expect($testAttr1.getAttribute('ref')).toBe(updatedRef2);
|
|
97
|
+
expect($testAttr1.getAttribute('style')).toBe(null);
|
|
98
|
+
// check existing attribute untouch
|
|
99
|
+
expect($testAttr1.getAttribute('id')).toBe('testAttr1');
|
|
100
|
+
expect($testAttr1.getAttribute('class')).toBe('test');
|
|
101
|
+
}, {timeout: 500});
|
|
102
|
+
});
|
|
103
|
+
});
|