haori 0.13.0 → 0.13.2
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/README.ja.md +1 -1
- package/README.md +1 -1
- package/dist/haori.cjs.js +10 -10
- package/dist/haori.es.js +191 -165
- package/dist/haori.iife.js +10 -10
- package/dist/index.d.ts +1 -1
- package/package.json +11 -3
- package/dist/haori.cjs.js.map +0 -1
- package/dist/haori.es.js.map +0 -1
- package/dist/haori.iife.js.map +0 -1
- package/dist/package.json +0 -70
- package/dist/src/builtins.d.ts +0 -100
- package/dist/src/builtins.d.ts.map +0 -1
- package/dist/src/builtins.js +0 -194
- package/dist/src/builtins.js.map +0 -1
- package/dist/src/core.d.ts +0 -505
- package/dist/src/core.d.ts.map +0 -1
- package/dist/src/core.js +0 -1817
- package/dist/src/core.js.map +0 -1
- package/dist/src/dev.d.ts +0 -35
- package/dist/src/dev.d.ts.map +0 -1
- package/dist/src/dev.js +0 -44
- package/dist/src/dev.js.map +0 -1
- package/dist/src/env.d.ts +0 -43
- package/dist/src/env.d.ts.map +0 -1
- package/dist/src/env.js +0 -108
- package/dist/src/env.js.map +0 -1
- package/dist/src/event.d.ts +0 -171
- package/dist/src/event.d.ts.map +0 -1
- package/dist/src/event.js +0 -235
- package/dist/src/event.js.map +0 -1
- package/dist/src/event_dispatcher.d.ts +0 -66
- package/dist/src/event_dispatcher.d.ts.map +0 -1
- package/dist/src/event_dispatcher.js +0 -167
- package/dist/src/event_dispatcher.js.map +0 -1
- package/dist/src/expression.d.ts +0 -260
- package/dist/src/expression.d.ts.map +0 -1
- package/dist/src/expression.js +0 -975
- package/dist/src/expression.js.map +0 -1
- package/dist/src/form.d.ts +0 -148
- package/dist/src/form.d.ts.map +0 -1
- package/dist/src/form.js +0 -428
- package/dist/src/form.js.map +0 -1
- package/dist/src/fragment.d.ts +0 -621
- package/dist/src/fragment.d.ts.map +0 -1
- package/dist/src/fragment.js +0 -1963
- package/dist/src/fragment.js.map +0 -1
- package/dist/src/haori.d.ts +0 -130
- package/dist/src/haori.d.ts.map +0 -1
- package/dist/src/haori.js +0 -215
- package/dist/src/haori.js.map +0 -1
- package/dist/src/import.d.ts +0 -19
- package/dist/src/import.d.ts.map +0 -1
- package/dist/src/import.js +0 -64
- package/dist/src/import.js.map +0 -1
- package/dist/src/index.d.ts +0 -27
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -30
- package/dist/src/index.js.map +0 -1
- package/dist/src/intersect.d.ts +0 -28
- package/dist/src/intersect.d.ts.map +0 -1
- package/dist/src/intersect.js +0 -201
- package/dist/src/intersect.js.map +0 -1
- package/dist/src/log.d.ts +0 -32
- package/dist/src/log.d.ts.map +0 -1
- package/dist/src/log.js +0 -43
- package/dist/src/log.js.map +0 -1
- package/dist/src/observer.d.ts +0 -24
- package/dist/src/observer.d.ts.map +0 -1
- package/dist/src/observer.js +0 -131
- package/dist/src/observer.js.map +0 -1
- package/dist/src/procedure.d.ts +0 -447
- package/dist/src/procedure.d.ts.map +0 -1
- package/dist/src/procedure.js +0 -1921
- package/dist/src/procedure.js.map +0 -1
- package/dist/src/queue.d.ts +0 -35
- package/dist/src/queue.d.ts.map +0 -1
- package/dist/src/queue.js +0 -202
- package/dist/src/queue.js.map +0 -1
- package/dist/src/url.d.ts +0 -14
- package/dist/src/url.d.ts.map +0 -1
- package/dist/src/url.js +0 -22
- package/dist/src/url.js.map +0 -1
- package/dist/tests/bind-arg-own-binding.test.d.ts +0 -2
- package/dist/tests/bind-arg-own-binding.test.d.ts.map +0 -1
- package/dist/tests/bind-arg-own-binding.test.js +0 -63
- package/dist/tests/bind-arg-own-binding.test.js.map +0 -1
- package/dist/tests/bindcomplete-and-scope.test.d.ts +0 -2
- package/dist/tests/bindcomplete-and-scope.test.d.ts.map +0 -1
- package/dist/tests/bindcomplete-and-scope.test.js +0 -115
- package/dist/tests/bindcomplete-and-scope.test.js.map +0 -1
- package/dist/tests/builtins.test.d.ts +0 -2
- package/dist/tests/builtins.test.d.ts.map +0 -1
- package/dist/tests/builtins.test.js +0 -152
- package/dist/tests/builtins.test.js.map +0 -1
- package/dist/tests/click-attributes.test.d.ts +0 -2
- package/dist/tests/click-attributes.test.d.ts.map +0 -1
- package/dist/tests/click-attributes.test.js +0 -113
- package/dist/tests/click-attributes.test.js.map +0 -1
- package/dist/tests/click-no-disabled.test.d.ts +0 -2
- package/dist/tests/click-no-disabled.test.d.ts.map +0 -1
- package/dist/tests/click-no-disabled.test.js +0 -67
- package/dist/tests/click-no-disabled.test.js.map +0 -1
- package/dist/tests/core.test.d.ts +0 -5
- package/dist/tests/core.test.d.ts.map +0 -1
- package/dist/tests/core.test.js +0 -1056
- package/dist/tests/core.test.js.map +0 -1
- package/dist/tests/data-bind-arg-reeval.test.d.ts +0 -2
- package/dist/tests/data-bind-arg-reeval.test.d.ts.map +0 -1
- package/dist/tests/data-bind-arg-reeval.test.js +0 -119
- package/dist/tests/data-bind-arg-reeval.test.js.map +0 -1
- package/dist/tests/data-bind-merge.test.d.ts +0 -2
- package/dist/tests/data-bind-merge.test.d.ts.map +0 -1
- package/dist/tests/data-bind-merge.test.js +0 -86
- package/dist/tests/data-bind-merge.test.js.map +0 -1
- package/dist/tests/data-click-defer.test.d.ts +0 -2
- package/dist/tests/data-click-defer.test.d.ts.map +0 -1
- package/dist/tests/data-click-defer.test.js +0 -57
- package/dist/tests/data-click-defer.test.js.map +0 -1
- package/dist/tests/data-click-run.test.d.ts +0 -5
- package/dist/tests/data-click-run.test.d.ts.map +0 -1
- package/dist/tests/data-click-run.test.js +0 -109
- package/dist/tests/data-click-run.test.js.map +0 -1
- package/dist/tests/data-derive.test.d.ts +0 -2
- package/dist/tests/data-derive.test.d.ts.map +0 -1
- package/dist/tests/data-derive.test.js +0 -999
- package/dist/tests/data-derive.test.js.map +0 -1
- package/dist/tests/data-each-browserlike.test.d.ts +0 -2
- package/dist/tests/data-each-browserlike.test.d.ts.map +0 -1
- package/dist/tests/data-each-browserlike.test.js +0 -48
- package/dist/tests/data-each-browserlike.test.js.map +0 -1
- package/dist/tests/data-each-fragment-debug.test.d.ts +0 -2
- package/dist/tests/data-each-fragment-debug.test.d.ts.map +0 -1
- package/dist/tests/data-each-fragment-debug.test.js +0 -119
- package/dist/tests/data-each-fragment-debug.test.js.map +0 -1
- package/dist/tests/data-each-table.test.d.ts +0 -2
- package/dist/tests/data-each-table.test.d.ts.map +0 -1
- package/dist/tests/data-each-table.test.js +0 -131
- package/dist/tests/data-each-table.test.js.map +0 -1
- package/dist/tests/data-each-template-recovery.test.d.ts +0 -2
- package/dist/tests/data-each-template-recovery.test.d.ts.map +0 -1
- package/dist/tests/data-each-template-recovery.test.js +0 -87
- package/dist/tests/data-each-template-recovery.test.js.map +0 -1
- package/dist/tests/data-event-prevent.test.d.ts +0 -2
- package/dist/tests/data-event-prevent.test.d.ts.map +0 -1
- package/dist/tests/data-event-prevent.test.js +0 -76
- package/dist/tests/data-event-prevent.test.js.map +0 -1
- package/dist/tests/data-fetch-form-input-binding.test.d.ts +0 -2
- package/dist/tests/data-fetch-form-input-binding.test.d.ts.map +0 -1
- package/dist/tests/data-fetch-form-input-binding.test.js +0 -202
- package/dist/tests/data-fetch-form-input-binding.test.js.map +0 -1
- package/dist/tests/data-fetch-tbody-dom.test.d.ts +0 -2
- package/dist/tests/data-fetch-tbody-dom.test.d.ts.map +0 -1
- package/dist/tests/data-fetch-tbody-dom.test.js +0 -82
- package/dist/tests/data-fetch-tbody-dom.test.js.map +0 -1
- package/dist/tests/data-form-container.test.d.ts +0 -2
- package/dist/tests/data-form-container.test.d.ts.map +0 -1
- package/dist/tests/data-form-container.test.js +0 -88
- package/dist/tests/data-form-container.test.js.map +0 -1
- package/dist/tests/data-if-dev-diagnostics.test.d.ts +0 -2
- package/dist/tests/data-if-dev-diagnostics.test.d.ts.map +0 -1
- package/dist/tests/data-if-dev-diagnostics.test.js +0 -55
- package/dist/tests/data-if-dev-diagnostics.test.js.map +0 -1
- package/dist/tests/data-if-falsy.test.d.ts +0 -2
- package/dist/tests/data-if-falsy.test.d.ts.map +0 -1
- package/dist/tests/data-if-falsy.test.js +0 -73
- package/dist/tests/data-if-falsy.test.js.map +0 -1
- package/dist/tests/data-load-on-show.test.d.ts +0 -2
- package/dist/tests/data-load-on-show.test.d.ts.map +0 -1
- package/dist/tests/data-load-on-show.test.js +0 -98
- package/dist/tests/data-load-on-show.test.js.map +0 -1
- package/dist/tests/derive-each-render-wait.test.d.ts +0 -2
- package/dist/tests/derive-each-render-wait.test.d.ts.map +0 -1
- package/dist/tests/derive-each-render-wait.test.js +0 -90
- package/dist/tests/derive-each-render-wait.test.js.map +0 -1
- package/dist/tests/dev.test.d.ts +0 -2
- package/dist/tests/dev.test.d.ts.map +0 -1
- package/dist/tests/dev.test.js +0 -51
- package/dist/tests/dev.test.js.map +0 -1
- package/dist/tests/each-update-event.test.d.ts +0 -2
- package/dist/tests/each-update-event.test.d.ts.map +0 -1
- package/dist/tests/each-update-event.test.js +0 -83
- package/dist/tests/each-update-event.test.js.map +0 -1
- package/dist/tests/each_arg.test.d.ts +0 -2
- package/dist/tests/each_arg.test.d.ts.map +0 -1
- package/dist/tests/each_arg.test.js +0 -41
- package/dist/tests/each_arg.test.js.map +0 -1
- package/dist/tests/env.test.d.ts +0 -2
- package/dist/tests/env.test.d.ts.map +0 -1
- package/dist/tests/env.test.js +0 -124
- package/dist/tests/env.test.js.map +0 -1
- package/dist/tests/evaluation-profile.test.d.ts +0 -2
- package/dist/tests/evaluation-profile.test.d.ts.map +0 -1
- package/dist/tests/evaluation-profile.test.js +0 -92
- package/dist/tests/evaluation-profile.test.js.map +0 -1
- package/dist/tests/event.test.d.ts +0 -2
- package/dist/tests/event.test.d.ts.map +0 -1
- package/dist/tests/event.test.js +0 -300
- package/dist/tests/event.test.js.map +0 -1
- package/dist/tests/expression-disallowed-keyword-hint.test.d.ts +0 -2
- package/dist/tests/expression-disallowed-keyword-hint.test.d.ts.map +0 -1
- package/dist/tests/expression-disallowed-keyword-hint.test.js +0 -45
- package/dist/tests/expression-disallowed-keyword-hint.test.js.map +0 -1
- package/dist/tests/expression-forbidden-hint.test.d.ts +0 -2
- package/dist/tests/expression-forbidden-hint.test.d.ts.map +0 -1
- package/dist/tests/expression-forbidden-hint.test.js +0 -37
- package/dist/tests/expression-forbidden-hint.test.js.map +0 -1
- package/dist/tests/expression.test.d.ts +0 -2
- package/dist/tests/expression.test.d.ts.map +0 -1
- package/dist/tests/expression.test.js +0 -482
- package/dist/tests/expression.test.js.map +0 -1
- package/dist/tests/fetch-and-procedure-scenarios.test.d.ts +0 -2
- package/dist/tests/fetch-and-procedure-scenarios.test.d.ts.map +0 -1
- package/dist/tests/fetch-and-procedure-scenarios.test.js +0 -195
- package/dist/tests/fetch-and-procedure-scenarios.test.js.map +0 -1
- package/dist/tests/form-number-type.test.d.ts +0 -2
- package/dist/tests/form-number-type.test.d.ts.map +0 -1
- package/dist/tests/form-number-type.test.js +0 -83
- package/dist/tests/form-number-type.test.js.map +0 -1
- package/dist/tests/form.test.d.ts +0 -2
- package/dist/tests/form.test.d.ts.map +0 -1
- package/dist/tests/form.test.js +0 -636
- package/dist/tests/form.test.js.map +0 -1
- package/dist/tests/fragment.test.d.ts +0 -2
- package/dist/tests/fragment.test.d.ts.map +0 -1
- package/dist/tests/fragment.test.js +0 -284
- package/dist/tests/fragment.test.js.map +0 -1
- package/dist/tests/haori.test.d.ts +0 -2
- package/dist/tests/haori.test.d.ts.map +0 -1
- package/dist/tests/haori.test.js +0 -149
- package/dist/tests/haori.test.js.map +0 -1
- package/dist/tests/helpers/async.d.ts +0 -20
- package/dist/tests/helpers/async.d.ts.map +0 -1
- package/dist/tests/helpers/async.js +0 -35
- package/dist/tests/helpers/async.js.map +0 -1
- package/dist/tests/import.test.d.ts +0 -2
- package/dist/tests/import.test.d.ts.map +0 -1
- package/dist/tests/import.test.js +0 -148
- package/dist/tests/import.test.js.map +0 -1
- package/dist/tests/intersect.test.d.ts +0 -2
- package/dist/tests/intersect.test.d.ts.map +0 -1
- package/dist/tests/intersect.test.js +0 -173
- package/dist/tests/intersect.test.js.map +0 -1
- package/dist/tests/log.test.d.ts +0 -2
- package/dist/tests/log.test.d.ts.map +0 -1
- package/dist/tests/log.test.js +0 -58
- package/dist/tests/log.test.js.map +0 -1
- package/dist/tests/observer.test.d.ts +0 -2
- package/dist/tests/observer.test.d.ts.map +0 -1
- package/dist/tests/observer.test.js +0 -64
- package/dist/tests/observer.test.js.map +0 -1
- package/dist/tests/placeholder-resolution.test.d.ts +0 -2
- package/dist/tests/placeholder-resolution.test.d.ts.map +0 -1
- package/dist/tests/placeholder-resolution.test.js +0 -463
- package/dist/tests/placeholder-resolution.test.js.map +0 -1
- package/dist/tests/procedure-action-operations.test.d.ts +0 -2
- package/dist/tests/procedure-action-operations.test.d.ts.map +0 -1
- package/dist/tests/procedure-action-operations.test.js +0 -1140
- package/dist/tests/procedure-action-operations.test.js.map +0 -1
- package/dist/tests/procedure-bind-append.test.d.ts +0 -2
- package/dist/tests/procedure-bind-append.test.d.ts.map +0 -1
- package/dist/tests/procedure-bind-append.test.js +0 -80
- package/dist/tests/procedure-bind-append.test.js.map +0 -1
- package/dist/tests/procedure-fetch-options.test.d.ts +0 -2
- package/dist/tests/procedure-fetch-options.test.d.ts.map +0 -1
- package/dist/tests/procedure-fetch-options.test.js +0 -255
- package/dist/tests/procedure-fetch-options.test.js.map +0 -1
- package/dist/tests/procedure.test.d.ts +0 -2
- package/dist/tests/procedure.test.d.ts.map +0 -1
- package/dist/tests/procedure.test.js +0 -137
- package/dist/tests/procedure.test.js.map +0 -1
- package/dist/tests/procedure_events.test.d.ts +0 -7
- package/dist/tests/procedure_events.test.d.ts.map +0 -1
- package/dist/tests/procedure_events.test.js +0 -261
- package/dist/tests/procedure_events.test.js.map +0 -1
- package/dist/tests/render-wait.test.d.ts +0 -2
- package/dist/tests/render-wait.test.d.ts.map +0 -1
- package/dist/tests/render-wait.test.js +0 -68
- package/dist/tests/render-wait.test.js.map +0 -1
- package/dist/tests/reset_each.test.d.ts +0 -2
- package/dist/tests/reset_each.test.d.ts.map +0 -1
- package/dist/tests/reset_each.test.js +0 -215
- package/dist/tests/reset_each.test.js.map +0 -1
- package/dist/tests/row-move.test.d.ts +0 -2
- package/dist/tests/row-move.test.d.ts.map +0 -1
- package/dist/tests/row-move.test.js +0 -220
- package/dist/tests/row-move.test.js.map +0 -1
- package/dist/tests/row-operations.test.d.ts +0 -2
- package/dist/tests/row-operations.test.d.ts.map +0 -1
- package/dist/tests/row-operations.test.js +0 -259
- package/dist/tests/row-operations.test.js.map +0 -1
- package/dist/tests/scheduled-evaluate-wait.test.d.ts +0 -2
- package/dist/tests/scheduled-evaluate-wait.test.d.ts.map +0 -1
- package/dist/tests/scheduled-evaluate-wait.test.js +0 -68
- package/dist/tests/scheduled-evaluate-wait.test.js.map +0 -1
- package/dist/tests/url.test.d.ts +0 -2
- package/dist/tests/url.test.d.ts.map +0 -1
- package/dist/tests/url.test.js +0 -150
- package/dist/tests/url.test.js.map +0 -1
- package/dist/vite.config.d.ts +0 -3
- package/dist/vite.config.d.ts.map +0 -1
- package/dist/vite.config.js +0 -28
- package/dist/vite.config.js.map +0 -1
- package/dist/vitest.config.d.ts +0 -3
- package/dist/vitest.config.d.ts.map +0 -1
- package/dist/vitest.config.js +0 -19
- package/dist/vitest.config.js.map +0 -1
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
/* @vitest-environment jsdom */
|
|
2
|
-
/**
|
|
3
|
-
* @fileoverview data-fetch によるフォーム入力バインディングのテスト
|
|
4
|
-
*
|
|
5
|
-
* コンテナ要素に data-fetch を設定し、取得データを value="{{field}}" テンプレートで
|
|
6
|
-
* フォーム入力に反映する際、element.value が正しく更新されることを検証します。
|
|
7
|
-
* 修正前は element.setAttribute('value', ...) が defaultValue のみ更新し、
|
|
8
|
-
* element.value が変化しない問題がありました。
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
11
|
-
import Core from '../src/core';
|
|
12
|
-
import Fragment from '../src/fragment';
|
|
13
|
-
import Form from '../src/form';
|
|
14
|
-
import { waitForDomSettled } from './helpers/async';
|
|
15
|
-
describe('data-fetch form input binding', () => {
|
|
16
|
-
let container;
|
|
17
|
-
beforeEach(() => {
|
|
18
|
-
vi.restoreAllMocks();
|
|
19
|
-
container = document.createElement('div');
|
|
20
|
-
document.body.appendChild(container);
|
|
21
|
-
});
|
|
22
|
-
afterEach(() => {
|
|
23
|
-
vi.restoreAllMocks();
|
|
24
|
-
document.body.removeChild(container);
|
|
25
|
-
});
|
|
26
|
-
it('value="{{field}}" の入力に element.value が反映される', async () => {
|
|
27
|
-
container.innerHTML = `
|
|
28
|
-
<div id="settings" data-bind='{"host":"","port":"","username":""}'>
|
|
29
|
-
<form>
|
|
30
|
-
<input id="host" name="host" type="text" value="{{host}}" />
|
|
31
|
-
<input id="port" name="port" type="number" value="{{port}}" />
|
|
32
|
-
<input id="username" name="username" type="email" value="{{username}}" />
|
|
33
|
-
</form>
|
|
34
|
-
</div>
|
|
35
|
-
`;
|
|
36
|
-
await Core.scan(container);
|
|
37
|
-
await waitForDomSettled();
|
|
38
|
-
const div = container.querySelector('#settings');
|
|
39
|
-
await Core.setBindingData(div, {
|
|
40
|
-
host: 'imap.example.com',
|
|
41
|
-
port: 993,
|
|
42
|
-
username: 'user@example.com',
|
|
43
|
-
});
|
|
44
|
-
await waitForDomSettled();
|
|
45
|
-
const hostInput = container.querySelector('#host');
|
|
46
|
-
const portInput = container.querySelector('#port');
|
|
47
|
-
const usernameInput = container.querySelector('#username');
|
|
48
|
-
expect(hostInput.value).toBe('imap.example.com');
|
|
49
|
-
expect(portInput.value).toBe('993');
|
|
50
|
-
expect(usernameInput.value).toBe('user@example.com');
|
|
51
|
-
});
|
|
52
|
-
it('Core.setBindingData で input と textarea の value が反映される', async () => {
|
|
53
|
-
container.innerHTML = `
|
|
54
|
-
<div id="form-container" data-bind='{"title":"","description":""}'>
|
|
55
|
-
<form>
|
|
56
|
-
<input id="title" name="title" type="text" value="{{title}}" />
|
|
57
|
-
<textarea id="description" name="description">{{description}}</textarea>
|
|
58
|
-
</form>
|
|
59
|
-
</div>
|
|
60
|
-
`;
|
|
61
|
-
await Core.scan(container);
|
|
62
|
-
await waitForDomSettled();
|
|
63
|
-
const div = container.querySelector('#form-container');
|
|
64
|
-
await Core.setBindingData(div, { title: '新しいタイトル', description: '説明文' });
|
|
65
|
-
await waitForDomSettled();
|
|
66
|
-
const titleInput = container.querySelector('#title');
|
|
67
|
-
const descriptionInput = container.querySelector('#description');
|
|
68
|
-
expect(titleInput.value).toBe('新しいタイトル');
|
|
69
|
-
expect(descriptionInput.value).toBe('説明文');
|
|
70
|
-
});
|
|
71
|
-
it('checkbox は value 属性を更新しても checked は変化しない', async () => {
|
|
72
|
-
container.innerHTML = `
|
|
73
|
-
<div id="cb-container" data-bind='{"enabled":true}'>
|
|
74
|
-
<form>
|
|
75
|
-
<input id="ssl" name="ssl" type="checkbox" value="{{enabled}}" />
|
|
76
|
-
</form>
|
|
77
|
-
</div>
|
|
78
|
-
`;
|
|
79
|
-
await Core.scan(container);
|
|
80
|
-
await waitForDomSettled();
|
|
81
|
-
const div = container.querySelector('#cb-container');
|
|
82
|
-
await Core.setBindingData(div, { enabled: true });
|
|
83
|
-
await waitForDomSettled();
|
|
84
|
-
const checkbox = container.querySelector('#ssl');
|
|
85
|
-
expect(checkbox.value).toBe('true');
|
|
86
|
-
expect(checkbox.checked).toBe(false);
|
|
87
|
-
});
|
|
88
|
-
it('select 要素の value も正しく更新される', async () => {
|
|
89
|
-
container.innerHTML = `
|
|
90
|
-
<div id="select-container" data-bind='{"role":"VIEWER"}'>
|
|
91
|
-
<form>
|
|
92
|
-
<select id="role" name="role" value="{{role}}">
|
|
93
|
-
<option value="ADMIN">管理者</option>
|
|
94
|
-
<option value="VIEWER">閲覧者</option>
|
|
95
|
-
</select>
|
|
96
|
-
</form>
|
|
97
|
-
</div>
|
|
98
|
-
`;
|
|
99
|
-
await Core.scan(container);
|
|
100
|
-
await waitForDomSettled();
|
|
101
|
-
const div = container.querySelector('#select-container');
|
|
102
|
-
await Core.setBindingData(div, { role: 'ADMIN' });
|
|
103
|
-
await waitForDomSettled();
|
|
104
|
-
const selectEl = container.querySelector('#role');
|
|
105
|
-
expect(selectEl.value).toBe('ADMIN');
|
|
106
|
-
});
|
|
107
|
-
it('form 自身の bindingData 更新で checkbox が無イベント同期される', async () => {
|
|
108
|
-
container.innerHTML = `
|
|
109
|
-
<form id="ssl-form" data-bind='{"mailImapSsl":false}'>
|
|
110
|
-
<input
|
|
111
|
-
id="mail-imap-ssl"
|
|
112
|
-
type="checkbox"
|
|
113
|
-
name="mailImapSsl"
|
|
114
|
-
value="true"
|
|
115
|
-
/>
|
|
116
|
-
</form>
|
|
117
|
-
`;
|
|
118
|
-
await Core.scan(container);
|
|
119
|
-
await waitForDomSettled();
|
|
120
|
-
const form = container.querySelector('#ssl-form');
|
|
121
|
-
const formFragment = Fragment.get(form);
|
|
122
|
-
const checkbox = container.querySelector('#mail-imap-ssl');
|
|
123
|
-
const changeSpy = vi.fn();
|
|
124
|
-
checkbox.addEventListener('change', changeSpy);
|
|
125
|
-
await Core.setBindingData(form, { mailImapSsl: true });
|
|
126
|
-
await waitForDomSettled();
|
|
127
|
-
expect(checkbox.checked).toBe(true);
|
|
128
|
-
expect(changeSpy).not.toHaveBeenCalled();
|
|
129
|
-
expect(Form.getValues(formFragment)).toEqual({ mailImapSsl: true });
|
|
130
|
-
await Core.setBindingData(form, { mailImapSsl: false });
|
|
131
|
-
await waitForDomSettled();
|
|
132
|
-
expect(checkbox.checked).toBe(false);
|
|
133
|
-
expect(changeSpy).not.toHaveBeenCalled();
|
|
134
|
-
expect(Form.getValues(formFragment)).toEqual({ mailImapSsl: false });
|
|
135
|
-
});
|
|
136
|
-
it('data-form-arg を持つ form でも該当データだけを無イベント同期する', async () => {
|
|
137
|
-
container.innerHTML = `
|
|
138
|
-
<form id="arg-form" data-bind='{"settings":{"enabled":false}}' data-form-arg="settings">
|
|
139
|
-
<input id="enabled" type="checkbox" name="enabled" value="true" />
|
|
140
|
-
</form>
|
|
141
|
-
`;
|
|
142
|
-
await Core.scan(container);
|
|
143
|
-
await waitForDomSettled();
|
|
144
|
-
const form = container.querySelector('#arg-form');
|
|
145
|
-
const checkbox = container.querySelector('#enabled');
|
|
146
|
-
await Core.setBindingData(form, {
|
|
147
|
-
settings: {
|
|
148
|
-
enabled: true,
|
|
149
|
-
},
|
|
150
|
-
});
|
|
151
|
-
await waitForDomSettled();
|
|
152
|
-
expect(checkbox.checked).toBe(true);
|
|
153
|
-
});
|
|
154
|
-
it('form 自身の bindingData 更新で bindchange が再帰発火しない', async () => {
|
|
155
|
-
container.innerHTML = `
|
|
156
|
-
<form id="loop-form" data-bind='{"mailImapSsl":false}'>
|
|
157
|
-
<input type="checkbox" name="mailImapSsl" value="true" />
|
|
158
|
-
</form>
|
|
159
|
-
`;
|
|
160
|
-
await Core.scan(container);
|
|
161
|
-
await waitForDomSettled();
|
|
162
|
-
const form = container.querySelector('#loop-form');
|
|
163
|
-
const bindChangeSpy = vi.fn();
|
|
164
|
-
form.addEventListener('haori:bindchange', bindChangeSpy);
|
|
165
|
-
await Core.setBindingData(form, { mailImapSsl: true });
|
|
166
|
-
await waitForDomSettled();
|
|
167
|
-
expect(bindChangeSpy).toHaveBeenCalledTimes(1);
|
|
168
|
-
expect(bindChangeSpy.mock.calls[0]?.[0]).toMatchObject({
|
|
169
|
-
detail: {
|
|
170
|
-
reason: 'manual',
|
|
171
|
-
changedKeys: ['mailImapSsl'],
|
|
172
|
-
},
|
|
173
|
-
});
|
|
174
|
-
await Core.setBindingData(form, { mailImapSsl: false });
|
|
175
|
-
await waitForDomSettled();
|
|
176
|
-
expect(bindChangeSpy).toHaveBeenCalledTimes(2);
|
|
177
|
-
});
|
|
178
|
-
it('Form.getValues で設定した値を取得できる', async () => {
|
|
179
|
-
container.innerHTML = `
|
|
180
|
-
<div id="fv-container" data-bind='{"name":"","email":""}'>
|
|
181
|
-
<form id="fv-form">
|
|
182
|
-
<input id="fv-name" name="name" type="text" value="{{name}}" />
|
|
183
|
-
<input id="fv-email" name="email" type="email" value="{{email}}" />
|
|
184
|
-
</form>
|
|
185
|
-
</div>
|
|
186
|
-
`;
|
|
187
|
-
await Core.scan(container);
|
|
188
|
-
await waitForDomSettled();
|
|
189
|
-
const div = container.querySelector('#fv-container');
|
|
190
|
-
await Core.setBindingData(div, { name: '山田太郎', email: 'yamada@example.com' });
|
|
191
|
-
await waitForDomSettled();
|
|
192
|
-
const form = container.querySelector('#fv-form');
|
|
193
|
-
const formFragment = Fragment.get(form);
|
|
194
|
-
const formValues = Form.getValues(formFragment);
|
|
195
|
-
const nameInput = container.querySelector('#fv-name');
|
|
196
|
-
const emailInput = container.querySelector('#fv-email');
|
|
197
|
-
expect(nameInput.value).toBe('山田太郎');
|
|
198
|
-
expect(emailInput.value).toBe('yamada@example.com');
|
|
199
|
-
expect(formValues).toEqual({ name: '山田太郎', email: 'yamada@example.com' });
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
//# sourceMappingURL=data-fetch-form-input-binding.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-fetch-form-input-binding.test.js","sourceRoot":"","sources":["../../tests/data-fetch-form-input-binding.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-fetch-tbody-dom.test.d.ts","sourceRoot":"","sources":["../../tests/data-fetch-tbody-dom.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/* @vitest-environment jsdom */
|
|
2
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
3
|
-
import Core from '../src/core';
|
|
4
|
-
import { waitForCondition } from './helpers/async';
|
|
5
|
-
const mockData = [
|
|
6
|
-
{ id: 1, name: 'りんご' },
|
|
7
|
-
{ id: 2, name: 'みかん' },
|
|
8
|
-
{ id: 3, name: 'バナナ' },
|
|
9
|
-
];
|
|
10
|
-
describe('data-fetch + data-each integration (tbody/tr)', () => {
|
|
11
|
-
let container;
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
container = document.createElement('div');
|
|
14
|
-
document.body.appendChild(container);
|
|
15
|
-
});
|
|
16
|
-
afterEach(() => {
|
|
17
|
-
document.body.removeChild(container);
|
|
18
|
-
vi.clearAllMocks();
|
|
19
|
-
vi.restoreAllMocks();
|
|
20
|
-
});
|
|
21
|
-
it('fetchで取得した配列がtbody内trとしてDOMに反映される', async () => {
|
|
22
|
-
const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response(JSON.stringify(mockData), {
|
|
23
|
-
headers: { 'Content-Type': 'application/json' },
|
|
24
|
-
}));
|
|
25
|
-
const root = document.createElement('div');
|
|
26
|
-
root.innerHTML = `
|
|
27
|
-
<div data-fetch="/api/data" data-fetch-arg="items" data-fetch-bind="#result"></div>
|
|
28
|
-
<div id="result" data-bind='{"items":[]}' >
|
|
29
|
-
<table>
|
|
30
|
-
<tbody data-each="items" data-each-key="id">
|
|
31
|
-
<tr>
|
|
32
|
-
<td>{{id}}</td>
|
|
33
|
-
<td>{{name}}</td>
|
|
34
|
-
</tr>
|
|
35
|
-
</tbody>
|
|
36
|
-
</table>
|
|
37
|
-
</div>
|
|
38
|
-
`;
|
|
39
|
-
container.appendChild(root);
|
|
40
|
-
await Core.scan(root);
|
|
41
|
-
await waitForCondition(() => globalThis.fetch.mock.calls.length > 0, { description: 'fetch call' });
|
|
42
|
-
// tbodyのtr要素数のみをまず確認
|
|
43
|
-
const tbody = container.querySelector('tbody');
|
|
44
|
-
expect(tbody).not.toBeNull();
|
|
45
|
-
await waitForCondition(() => tbody.querySelectorAll('tr').length === 3, { description: 'tbody rows' });
|
|
46
|
-
const rows = tbody.querySelectorAll('tr');
|
|
47
|
-
expect(fetchSpy).toHaveBeenCalled();
|
|
48
|
-
// trのFragmentからバインドデータを直接確認
|
|
49
|
-
const Fragment = (await import('../src/fragment')).default;
|
|
50
|
-
const tr0 = rows[0];
|
|
51
|
-
const tr1 = rows[1];
|
|
52
|
-
const tr2 = rows[2];
|
|
53
|
-
const frag0 = Fragment.get(tr0);
|
|
54
|
-
const frag1 = Fragment.get(tr1);
|
|
55
|
-
const frag2 = Fragment.get(tr2);
|
|
56
|
-
expect(frag0.getBindingData().id).toBe(1);
|
|
57
|
-
expect(frag0.getBindingData().name).toBe('りんご');
|
|
58
|
-
expect(frag1.getBindingData().id).toBe(2);
|
|
59
|
-
expect(frag1.getBindingData().name).toBe('みかん');
|
|
60
|
-
expect(frag2.getBindingData().id).toBe(3);
|
|
61
|
-
expect(frag2.getBindingData().name).toBe('バナナ');
|
|
62
|
-
// textContentも全trでassert
|
|
63
|
-
expect(tr0.textContent).toContain('1');
|
|
64
|
-
expect(tr0.textContent).toContain('りんご');
|
|
65
|
-
expect(tr1.textContent).toContain('2');
|
|
66
|
-
expect(tr1.textContent).toContain('みかん');
|
|
67
|
-
expect(tr2.textContent).toContain('3');
|
|
68
|
-
expect(tr2.textContent).toContain('バナナ');
|
|
69
|
-
expect(frag1.getBindingData().id).toBe(2);
|
|
70
|
-
expect(frag1.getBindingData().name).toBe('みかん');
|
|
71
|
-
expect(frag2.getBindingData().id).toBe(3);
|
|
72
|
-
expect(frag2.getBindingData().name).toBe('バナナ');
|
|
73
|
-
// textContentも全trでassert
|
|
74
|
-
expect(rows[0].textContent).toContain('1');
|
|
75
|
-
expect(rows[0].textContent).toContain('りんご');
|
|
76
|
-
expect(rows[1].textContent).toContain('2');
|
|
77
|
-
expect(rows[1].textContent).toContain('みかん');
|
|
78
|
-
expect(rows[2].textContent).toContain('3');
|
|
79
|
-
expect(rows[2].textContent).toContain('バナナ');
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
//# sourceMappingURL=data-fetch-tbody-dom.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-fetch-tbody-dom.test.js","sourceRoot":"","sources":["../../tests/data-fetch-tbody-dom.test.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAC,MAAM,QAAQ,CAAC;AACvE,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAEjD,MAAM,QAAQ,GAAG;IACf,EAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAC;IACpB,EAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAC;IACpB,EAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAC;CACrB,CAAC;AAEF,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,IAAI,SAAsB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACrC,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAC9D,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;YACrC,OAAO,EAAE,EAAC,cAAc,EAAE,kBAAkB,EAAC;SAC9C,CAAC,CACH,CAAC;QAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG;;;;;;;;;;;;KAYhB,CAAC;QACF,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,gBAAgB,CACpB,GAAG,EAAE,CAAE,UAAU,CAAC,KAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EACrD,EAAC,WAAW,EAAE,YAAY,EAAC,CAC5B,CAAC;QACF,qBAAqB;QACrB,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,gBAAgB,CACpB,GAAG,EAAE,CAAC,KAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAChD,EAAC,WAAW,EAAE,YAAY,EAAC,CAC5B,CAAC;QACF,MAAM,IAAI,GAAG,KAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACpC,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3D,MAAM,GAAG,GAAI,IAAwC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAI,IAAwC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAI,IAAwC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,yBAAyB;QACzB,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhD,yBAAyB;QACzB,MAAM,CAAE,IAAwC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CACxE,GAAG,CACJ,CAAC;QACF,MAAM,CAAE,IAAwC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CACxE,KAAK,CACN,CAAC;QACF,MAAM,CAAE,IAAwC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CACxE,GAAG,CACJ,CAAC;QACF,MAAM,CAAE,IAAwC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CACxE,KAAK,CACN,CAAC;QACF,MAAM,CAAE,IAAwC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CACxE,GAAG,CACJ,CAAC;QACF,MAAM,CAAE,IAAwC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CACxE,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-form-container.test.d.ts","sourceRoot":"","sources":["../../tests/data-form-container.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/* @vitest-environment jsdom */
|
|
2
|
-
/**
|
|
3
|
-
* @fileoverview
|
|
4
|
-
* data-form 属性により非 form 要素(<tr> など)をフォームコンテナ化し、
|
|
5
|
-
* data-click-form で値収集できることを検証する。
|
|
6
|
-
*/
|
|
7
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
8
|
-
import Core from '../src/core';
|
|
9
|
-
import Form from '../src/form';
|
|
10
|
-
import EventDispatcher from '../src/event_dispatcher';
|
|
11
|
-
import Fragment from '../src/fragment';
|
|
12
|
-
import { waitForCondition, waitForDomSettled } from './helpers/async';
|
|
13
|
-
describe('data-form コンテナ', () => {
|
|
14
|
-
let container;
|
|
15
|
-
let dispatcher;
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
vi.restoreAllMocks();
|
|
18
|
-
container = document.createElement('div');
|
|
19
|
-
document.body.appendChild(container);
|
|
20
|
-
dispatcher = new EventDispatcher(document);
|
|
21
|
-
dispatcher.start();
|
|
22
|
-
});
|
|
23
|
-
afterEach(() => {
|
|
24
|
-
dispatcher.stop();
|
|
25
|
-
vi.restoreAllMocks();
|
|
26
|
-
document.body.removeChild(container);
|
|
27
|
-
});
|
|
28
|
-
it('getFormFragment は data-form 要素を form コンテナとして認識する', async () => {
|
|
29
|
-
container.innerHTML = `
|
|
30
|
-
<div data-form id="grp">
|
|
31
|
-
<input name="a" value="x">
|
|
32
|
-
<button id="b">go</button>
|
|
33
|
-
</div>`;
|
|
34
|
-
await Core.scan(container);
|
|
35
|
-
await waitForDomSettled();
|
|
36
|
-
const btnFrag = Fragment.get(container.querySelector('#b'));
|
|
37
|
-
const formFrag = Form.getFormFragment(btnFrag);
|
|
38
|
-
expect(formFrag).not.toBeNull();
|
|
39
|
-
expect(formFrag.getTarget().id).toBe('grp');
|
|
40
|
-
expect(Form.getValues(formFrag).a).toBe('x');
|
|
41
|
-
});
|
|
42
|
-
it('テーブル行 <tr data-form> の値を data-click-form で収集し PUT 送信する', async () => {
|
|
43
|
-
const calls = [];
|
|
44
|
-
vi.spyOn(globalThis, 'fetch').mockImplementation((url, opts) => {
|
|
45
|
-
calls.push({
|
|
46
|
-
url: String(url),
|
|
47
|
-
method: opts?.method,
|
|
48
|
-
body: opts?.body ? JSON.parse(opts.body) : undefined,
|
|
49
|
-
});
|
|
50
|
-
return Promise.resolve(new Response('{}', { headers: { 'Content-Type': 'application/json' } }));
|
|
51
|
-
});
|
|
52
|
-
container.innerHTML = `
|
|
53
|
-
<div id="root" data-bind='{"prices":[{"id":10},{"id":20}]}'>
|
|
54
|
-
<table><tbody data-each="prices" data-each-key="id">
|
|
55
|
-
<tr data-form>
|
|
56
|
-
<td><input name="startMonth" type="text"></td>
|
|
57
|
-
<td><input name="price" type="number"></td>
|
|
58
|
-
<td><button class="confirm"
|
|
59
|
-
data-click-fetch="{{'/api/prices/' + id}}"
|
|
60
|
-
data-click-fetch-method="PUT"
|
|
61
|
-
data-click-form>確定</button></td>
|
|
62
|
-
</tr>
|
|
63
|
-
</tbody></table>
|
|
64
|
-
</div>`;
|
|
65
|
-
await Core.scan(container);
|
|
66
|
-
await waitForDomSettled();
|
|
67
|
-
const rows = container.querySelectorAll('tbody tr');
|
|
68
|
-
expect(rows.length).toBe(2);
|
|
69
|
-
// 2行目に値を入力して確定する(change で内部値へ同期)。
|
|
70
|
-
const row2 = rows[1];
|
|
71
|
-
const setInput = (sel, value) => {
|
|
72
|
-
const input = row2.querySelector(sel);
|
|
73
|
-
input.value = value;
|
|
74
|
-
input.dispatchEvent(new Event('change', { bubbles: true }));
|
|
75
|
-
};
|
|
76
|
-
setInput('[name="startMonth"]', '2026-04');
|
|
77
|
-
setInput('[name="price"]', '1200');
|
|
78
|
-
await waitForDomSettled();
|
|
79
|
-
row2.querySelector('.confirm').click();
|
|
80
|
-
await waitForCondition(() => calls.length > 0, { description: 'PUT 送信' });
|
|
81
|
-
// 行の id を含む URL と、行内の入力値が送信される。
|
|
82
|
-
expect(calls[0].url).toBe('/api/prices/20');
|
|
83
|
-
expect(calls[0].method).toBe('PUT');
|
|
84
|
-
// price は type="number" のため数値型で送信される
|
|
85
|
-
expect(calls[0].body).toMatchObject({ startMonth: '2026-04', price: 1200 });
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
//# sourceMappingURL=data-form-container.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-form-container.test.js","sourceRoot":"","sources":["../../tests/data-form-container.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-if-dev-diagnostics.test.d.ts","sourceRoot":"","sources":["../../tests/data-if-dev-diagnostics.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/* @vitest-environment jsdom */
|
|
2
|
-
/**
|
|
3
|
-
* @fileoverview
|
|
4
|
-
* 開発モードで data-if が falsy(非表示)になったとき、式と参照スコープの由来を
|
|
5
|
-
* コンソールに出力することを検証する(改修依頼3.3 のデバッグ補助)。
|
|
6
|
-
*/
|
|
7
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
8
|
-
import Core from '../src/core';
|
|
9
|
-
import Dev from '../src/dev';
|
|
10
|
-
import Log from '../src/log';
|
|
11
|
-
import { waitForDomSettled } from './helpers/async';
|
|
12
|
-
describe('data-if 開発モード診断(依頼3.3)', () => {
|
|
13
|
-
let container;
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
vi.restoreAllMocks();
|
|
16
|
-
container = document.createElement('div');
|
|
17
|
-
document.body.appendChild(container);
|
|
18
|
-
});
|
|
19
|
-
afterEach(() => {
|
|
20
|
-
Dev.disable();
|
|
21
|
-
vi.restoreAllMocks();
|
|
22
|
-
document.body.removeChild(container);
|
|
23
|
-
});
|
|
24
|
-
it('開発モードで falsy data-if の式と参照スコープを出力する', async () => {
|
|
25
|
-
const info = vi.spyOn(Log, 'info').mockImplementation(() => undefined);
|
|
26
|
-
Dev.enable();
|
|
27
|
-
// id は外側 #state の値(truthy)に解決され、!(... || id) は falsy → 非表示
|
|
28
|
-
container.innerHTML = `
|
|
29
|
-
<div id="state" data-bind='{"id":"CUST-1"}'>
|
|
30
|
-
<button data-if="!id">新規</button>
|
|
31
|
-
</div>`;
|
|
32
|
-
await Core.scan(container);
|
|
33
|
-
await waitForDomSettled();
|
|
34
|
-
const logged = info.mock.calls.some(args => args.some(a => typeof a === 'string' && a.includes('data-if is falsy')));
|
|
35
|
-
expect(logged).toBe(true);
|
|
36
|
-
// 参照スコープに id の由来(#state)が含まれること
|
|
37
|
-
const hasScope = info.mock.calls.some(args => args.some(a => a !== null &&
|
|
38
|
-
typeof a === 'object' &&
|
|
39
|
-
'id' in a));
|
|
40
|
-
expect(hasScope).toBe(true);
|
|
41
|
-
});
|
|
42
|
-
it('開発モード無効時は出力しない', async () => {
|
|
43
|
-
const info = vi.spyOn(Log, 'info').mockImplementation(() => undefined);
|
|
44
|
-
Dev.disable();
|
|
45
|
-
container.innerHTML = `
|
|
46
|
-
<div id="state2" data-bind='{"id":"CUST-1"}'>
|
|
47
|
-
<button data-if="!id">新規</button>
|
|
48
|
-
</div>`;
|
|
49
|
-
await Core.scan(container);
|
|
50
|
-
await waitForDomSettled();
|
|
51
|
-
const logged = info.mock.calls.some(args => args.some(a => typeof a === 'string' && a.includes('data-if is falsy')));
|
|
52
|
-
expect(logged).toBe(false);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
//# sourceMappingURL=data-if-dev-diagnostics.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-if-dev-diagnostics.test.js","sourceRoot":"","sources":["../../tests/data-if-dev-diagnostics.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-if-falsy.test.d.ts","sourceRoot":"","sources":["../../tests/data-if-falsy.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/* @vitest-environment jsdom */
|
|
2
|
-
/**
|
|
3
|
-
* @fileoverview
|
|
4
|
-
* data-if の非表示判定が JavaScript の falsy 準拠であることを検証するテストです。
|
|
5
|
-
* `0` や空文字列 `''` は非表示、空配列 `[]` などのオブジェクトは表示されることを確認します。
|
|
6
|
-
*/
|
|
7
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
8
|
-
import Core from '../src/core';
|
|
9
|
-
import { waitForDomSettled } from './helpers/async';
|
|
10
|
-
describe('data-if の falsy 判定', () => {
|
|
11
|
-
let container;
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.restoreAllMocks();
|
|
14
|
-
container = document.createElement('div');
|
|
15
|
-
document.body.appendChild(container);
|
|
16
|
-
});
|
|
17
|
-
afterEach(() => {
|
|
18
|
-
vi.restoreAllMocks();
|
|
19
|
-
document.body.removeChild(container);
|
|
20
|
-
});
|
|
21
|
-
/**
|
|
22
|
-
* 指定 id の要素が非表示(data-if-false 付き)かどうかを返します。
|
|
23
|
-
*
|
|
24
|
-
* @param id 要素 id
|
|
25
|
-
* @return 非表示なら true
|
|
26
|
-
*/
|
|
27
|
-
const isHidden = (id) => container.querySelector(`#${id}`).hasAttribute('data-if-false');
|
|
28
|
-
it('数値 0(items.length)は非表示、要素があれば表示になる', async () => {
|
|
29
|
-
container.innerHTML = `
|
|
30
|
-
<div id="root" data-bind='{"items":[]}'>
|
|
31
|
-
<p id="len" data-if="items.length">件あり</p>
|
|
32
|
-
</div>
|
|
33
|
-
`;
|
|
34
|
-
const root = container.querySelector('#root');
|
|
35
|
-
await Core.scan(root);
|
|
36
|
-
await waitForDomSettled();
|
|
37
|
-
// items.length === 0 → falsy → 非表示
|
|
38
|
-
expect(isHidden('len')).toBe(true);
|
|
39
|
-
await Core.setBindingData(root, { items: [{ id: 1 }] });
|
|
40
|
-
await waitForDomSettled();
|
|
41
|
-
// items.length === 1 → truthy → 表示
|
|
42
|
-
expect(isHidden('len')).toBe(false);
|
|
43
|
-
});
|
|
44
|
-
it('空文字列は非表示、非空文字列は表示になる(存在チェック)', async () => {
|
|
45
|
-
container.innerHTML = `
|
|
46
|
-
<div id="root2" data-bind='{"message":""}'>
|
|
47
|
-
<p id="msg" data-if="message">{{message}}</p>
|
|
48
|
-
</div>
|
|
49
|
-
`;
|
|
50
|
-
const root = container.querySelector('#root2');
|
|
51
|
-
await Core.scan(root);
|
|
52
|
-
await waitForDomSettled();
|
|
53
|
-
expect(isHidden('msg')).toBe(true);
|
|
54
|
-
await Core.setBindingData(root, { message: 'こんにちは' });
|
|
55
|
-
await waitForDomSettled();
|
|
56
|
-
expect(isHidden('msg')).toBe(false);
|
|
57
|
-
});
|
|
58
|
-
it('空配列・空オブジェクトは truthy として表示される', async () => {
|
|
59
|
-
container.innerHTML = `
|
|
60
|
-
<div id="root3" data-bind='{"list":[],"obj":{}}'>
|
|
61
|
-
<p id="arr" data-if="list">配列あり</p>
|
|
62
|
-
<p id="o" data-if="obj">オブジェクトあり</p>
|
|
63
|
-
</div>
|
|
64
|
-
`;
|
|
65
|
-
const root = container.querySelector('#root3');
|
|
66
|
-
await Core.scan(root);
|
|
67
|
-
await waitForDomSettled();
|
|
68
|
-
// [] も {} も JavaScript では truthy なので表示
|
|
69
|
-
expect(isHidden('arr')).toBe(false);
|
|
70
|
-
expect(isHidden('o')).toBe(false);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
//# sourceMappingURL=data-if-falsy.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-if-falsy.test.js","sourceRoot":"","sources":["../../tests/data-if-falsy.test.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;;;GAIG;AACH,OAAO,EAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAC,MAAM,QAAQ,CAAC;AACvE,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,OAAO,EAAC,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAElD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,SAAsB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH;;;;;OAKG;IACH,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAW,EAAE,CACtC,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAiB,CAAC,YAAY,CAC7D,eAAe,CAChB,CAAC;IAEJ,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,SAAS,CAAC,SAAS,GAAG;;;;KAIrB,CAAC;QACF,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAgB,CAAC;QAC7D,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,iBAAiB,EAAE,CAAC;QAE1B,mCAAmC;QACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAC,KAAK,EAAE,CAAC,EAAC,EAAE,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACpD,MAAM,iBAAiB,EAAE,CAAC;QAE1B,mCAAmC;QACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,SAAS,CAAC,SAAS,GAAG;;;;KAIrB,CAAC;QACF,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAgB,CAAC;QAC9D,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,iBAAiB,EAAE,CAAC;QAE1B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC,CAAC;QACpD,MAAM,iBAAiB,EAAE,CAAC;QAE1B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,SAAS,CAAC,SAAS,GAAG;;;;;KAKrB,CAAC;QACF,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAgB,CAAC;QAC9D,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,iBAAiB,EAAE,CAAC;QAE1B,uCAAuC;QACvC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-load-on-show.test.d.ts","sourceRoot":"","sources":["../../tests/data-load-on-show.test.ts"],"names":[],"mappings":""}
|