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.
Files changed (307) hide show
  1. package/README.ja.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/haori.cjs.js +10 -10
  4. package/dist/haori.es.js +191 -165
  5. package/dist/haori.iife.js +10 -10
  6. package/dist/index.d.ts +1 -1
  7. package/package.json +11 -3
  8. package/dist/haori.cjs.js.map +0 -1
  9. package/dist/haori.es.js.map +0 -1
  10. package/dist/haori.iife.js.map +0 -1
  11. package/dist/package.json +0 -70
  12. package/dist/src/builtins.d.ts +0 -100
  13. package/dist/src/builtins.d.ts.map +0 -1
  14. package/dist/src/builtins.js +0 -194
  15. package/dist/src/builtins.js.map +0 -1
  16. package/dist/src/core.d.ts +0 -505
  17. package/dist/src/core.d.ts.map +0 -1
  18. package/dist/src/core.js +0 -1817
  19. package/dist/src/core.js.map +0 -1
  20. package/dist/src/dev.d.ts +0 -35
  21. package/dist/src/dev.d.ts.map +0 -1
  22. package/dist/src/dev.js +0 -44
  23. package/dist/src/dev.js.map +0 -1
  24. package/dist/src/env.d.ts +0 -43
  25. package/dist/src/env.d.ts.map +0 -1
  26. package/dist/src/env.js +0 -108
  27. package/dist/src/env.js.map +0 -1
  28. package/dist/src/event.d.ts +0 -171
  29. package/dist/src/event.d.ts.map +0 -1
  30. package/dist/src/event.js +0 -235
  31. package/dist/src/event.js.map +0 -1
  32. package/dist/src/event_dispatcher.d.ts +0 -66
  33. package/dist/src/event_dispatcher.d.ts.map +0 -1
  34. package/dist/src/event_dispatcher.js +0 -167
  35. package/dist/src/event_dispatcher.js.map +0 -1
  36. package/dist/src/expression.d.ts +0 -260
  37. package/dist/src/expression.d.ts.map +0 -1
  38. package/dist/src/expression.js +0 -975
  39. package/dist/src/expression.js.map +0 -1
  40. package/dist/src/form.d.ts +0 -148
  41. package/dist/src/form.d.ts.map +0 -1
  42. package/dist/src/form.js +0 -428
  43. package/dist/src/form.js.map +0 -1
  44. package/dist/src/fragment.d.ts +0 -621
  45. package/dist/src/fragment.d.ts.map +0 -1
  46. package/dist/src/fragment.js +0 -1963
  47. package/dist/src/fragment.js.map +0 -1
  48. package/dist/src/haori.d.ts +0 -130
  49. package/dist/src/haori.d.ts.map +0 -1
  50. package/dist/src/haori.js +0 -215
  51. package/dist/src/haori.js.map +0 -1
  52. package/dist/src/import.d.ts +0 -19
  53. package/dist/src/import.d.ts.map +0 -1
  54. package/dist/src/import.js +0 -64
  55. package/dist/src/import.js.map +0 -1
  56. package/dist/src/index.d.ts +0 -27
  57. package/dist/src/index.d.ts.map +0 -1
  58. package/dist/src/index.js +0 -30
  59. package/dist/src/index.js.map +0 -1
  60. package/dist/src/intersect.d.ts +0 -28
  61. package/dist/src/intersect.d.ts.map +0 -1
  62. package/dist/src/intersect.js +0 -201
  63. package/dist/src/intersect.js.map +0 -1
  64. package/dist/src/log.d.ts +0 -32
  65. package/dist/src/log.d.ts.map +0 -1
  66. package/dist/src/log.js +0 -43
  67. package/dist/src/log.js.map +0 -1
  68. package/dist/src/observer.d.ts +0 -24
  69. package/dist/src/observer.d.ts.map +0 -1
  70. package/dist/src/observer.js +0 -131
  71. package/dist/src/observer.js.map +0 -1
  72. package/dist/src/procedure.d.ts +0 -447
  73. package/dist/src/procedure.d.ts.map +0 -1
  74. package/dist/src/procedure.js +0 -1921
  75. package/dist/src/procedure.js.map +0 -1
  76. package/dist/src/queue.d.ts +0 -35
  77. package/dist/src/queue.d.ts.map +0 -1
  78. package/dist/src/queue.js +0 -202
  79. package/dist/src/queue.js.map +0 -1
  80. package/dist/src/url.d.ts +0 -14
  81. package/dist/src/url.d.ts.map +0 -1
  82. package/dist/src/url.js +0 -22
  83. package/dist/src/url.js.map +0 -1
  84. package/dist/tests/bind-arg-own-binding.test.d.ts +0 -2
  85. package/dist/tests/bind-arg-own-binding.test.d.ts.map +0 -1
  86. package/dist/tests/bind-arg-own-binding.test.js +0 -63
  87. package/dist/tests/bind-arg-own-binding.test.js.map +0 -1
  88. package/dist/tests/bindcomplete-and-scope.test.d.ts +0 -2
  89. package/dist/tests/bindcomplete-and-scope.test.d.ts.map +0 -1
  90. package/dist/tests/bindcomplete-and-scope.test.js +0 -115
  91. package/dist/tests/bindcomplete-and-scope.test.js.map +0 -1
  92. package/dist/tests/builtins.test.d.ts +0 -2
  93. package/dist/tests/builtins.test.d.ts.map +0 -1
  94. package/dist/tests/builtins.test.js +0 -152
  95. package/dist/tests/builtins.test.js.map +0 -1
  96. package/dist/tests/click-attributes.test.d.ts +0 -2
  97. package/dist/tests/click-attributes.test.d.ts.map +0 -1
  98. package/dist/tests/click-attributes.test.js +0 -113
  99. package/dist/tests/click-attributes.test.js.map +0 -1
  100. package/dist/tests/click-no-disabled.test.d.ts +0 -2
  101. package/dist/tests/click-no-disabled.test.d.ts.map +0 -1
  102. package/dist/tests/click-no-disabled.test.js +0 -67
  103. package/dist/tests/click-no-disabled.test.js.map +0 -1
  104. package/dist/tests/core.test.d.ts +0 -5
  105. package/dist/tests/core.test.d.ts.map +0 -1
  106. package/dist/tests/core.test.js +0 -1056
  107. package/dist/tests/core.test.js.map +0 -1
  108. package/dist/tests/data-bind-arg-reeval.test.d.ts +0 -2
  109. package/dist/tests/data-bind-arg-reeval.test.d.ts.map +0 -1
  110. package/dist/tests/data-bind-arg-reeval.test.js +0 -119
  111. package/dist/tests/data-bind-arg-reeval.test.js.map +0 -1
  112. package/dist/tests/data-bind-merge.test.d.ts +0 -2
  113. package/dist/tests/data-bind-merge.test.d.ts.map +0 -1
  114. package/dist/tests/data-bind-merge.test.js +0 -86
  115. package/dist/tests/data-bind-merge.test.js.map +0 -1
  116. package/dist/tests/data-click-defer.test.d.ts +0 -2
  117. package/dist/tests/data-click-defer.test.d.ts.map +0 -1
  118. package/dist/tests/data-click-defer.test.js +0 -57
  119. package/dist/tests/data-click-defer.test.js.map +0 -1
  120. package/dist/tests/data-click-run.test.d.ts +0 -5
  121. package/dist/tests/data-click-run.test.d.ts.map +0 -1
  122. package/dist/tests/data-click-run.test.js +0 -109
  123. package/dist/tests/data-click-run.test.js.map +0 -1
  124. package/dist/tests/data-derive.test.d.ts +0 -2
  125. package/dist/tests/data-derive.test.d.ts.map +0 -1
  126. package/dist/tests/data-derive.test.js +0 -999
  127. package/dist/tests/data-derive.test.js.map +0 -1
  128. package/dist/tests/data-each-browserlike.test.d.ts +0 -2
  129. package/dist/tests/data-each-browserlike.test.d.ts.map +0 -1
  130. package/dist/tests/data-each-browserlike.test.js +0 -48
  131. package/dist/tests/data-each-browserlike.test.js.map +0 -1
  132. package/dist/tests/data-each-fragment-debug.test.d.ts +0 -2
  133. package/dist/tests/data-each-fragment-debug.test.d.ts.map +0 -1
  134. package/dist/tests/data-each-fragment-debug.test.js +0 -119
  135. package/dist/tests/data-each-fragment-debug.test.js.map +0 -1
  136. package/dist/tests/data-each-table.test.d.ts +0 -2
  137. package/dist/tests/data-each-table.test.d.ts.map +0 -1
  138. package/dist/tests/data-each-table.test.js +0 -131
  139. package/dist/tests/data-each-table.test.js.map +0 -1
  140. package/dist/tests/data-each-template-recovery.test.d.ts +0 -2
  141. package/dist/tests/data-each-template-recovery.test.d.ts.map +0 -1
  142. package/dist/tests/data-each-template-recovery.test.js +0 -87
  143. package/dist/tests/data-each-template-recovery.test.js.map +0 -1
  144. package/dist/tests/data-event-prevent.test.d.ts +0 -2
  145. package/dist/tests/data-event-prevent.test.d.ts.map +0 -1
  146. package/dist/tests/data-event-prevent.test.js +0 -76
  147. package/dist/tests/data-event-prevent.test.js.map +0 -1
  148. package/dist/tests/data-fetch-form-input-binding.test.d.ts +0 -2
  149. package/dist/tests/data-fetch-form-input-binding.test.d.ts.map +0 -1
  150. package/dist/tests/data-fetch-form-input-binding.test.js +0 -202
  151. package/dist/tests/data-fetch-form-input-binding.test.js.map +0 -1
  152. package/dist/tests/data-fetch-tbody-dom.test.d.ts +0 -2
  153. package/dist/tests/data-fetch-tbody-dom.test.d.ts.map +0 -1
  154. package/dist/tests/data-fetch-tbody-dom.test.js +0 -82
  155. package/dist/tests/data-fetch-tbody-dom.test.js.map +0 -1
  156. package/dist/tests/data-form-container.test.d.ts +0 -2
  157. package/dist/tests/data-form-container.test.d.ts.map +0 -1
  158. package/dist/tests/data-form-container.test.js +0 -88
  159. package/dist/tests/data-form-container.test.js.map +0 -1
  160. package/dist/tests/data-if-dev-diagnostics.test.d.ts +0 -2
  161. package/dist/tests/data-if-dev-diagnostics.test.d.ts.map +0 -1
  162. package/dist/tests/data-if-dev-diagnostics.test.js +0 -55
  163. package/dist/tests/data-if-dev-diagnostics.test.js.map +0 -1
  164. package/dist/tests/data-if-falsy.test.d.ts +0 -2
  165. package/dist/tests/data-if-falsy.test.d.ts.map +0 -1
  166. package/dist/tests/data-if-falsy.test.js +0 -73
  167. package/dist/tests/data-if-falsy.test.js.map +0 -1
  168. package/dist/tests/data-load-on-show.test.d.ts +0 -2
  169. package/dist/tests/data-load-on-show.test.d.ts.map +0 -1
  170. package/dist/tests/data-load-on-show.test.js +0 -98
  171. package/dist/tests/data-load-on-show.test.js.map +0 -1
  172. package/dist/tests/derive-each-render-wait.test.d.ts +0 -2
  173. package/dist/tests/derive-each-render-wait.test.d.ts.map +0 -1
  174. package/dist/tests/derive-each-render-wait.test.js +0 -90
  175. package/dist/tests/derive-each-render-wait.test.js.map +0 -1
  176. package/dist/tests/dev.test.d.ts +0 -2
  177. package/dist/tests/dev.test.d.ts.map +0 -1
  178. package/dist/tests/dev.test.js +0 -51
  179. package/dist/tests/dev.test.js.map +0 -1
  180. package/dist/tests/each-update-event.test.d.ts +0 -2
  181. package/dist/tests/each-update-event.test.d.ts.map +0 -1
  182. package/dist/tests/each-update-event.test.js +0 -83
  183. package/dist/tests/each-update-event.test.js.map +0 -1
  184. package/dist/tests/each_arg.test.d.ts +0 -2
  185. package/dist/tests/each_arg.test.d.ts.map +0 -1
  186. package/dist/tests/each_arg.test.js +0 -41
  187. package/dist/tests/each_arg.test.js.map +0 -1
  188. package/dist/tests/env.test.d.ts +0 -2
  189. package/dist/tests/env.test.d.ts.map +0 -1
  190. package/dist/tests/env.test.js +0 -124
  191. package/dist/tests/env.test.js.map +0 -1
  192. package/dist/tests/evaluation-profile.test.d.ts +0 -2
  193. package/dist/tests/evaluation-profile.test.d.ts.map +0 -1
  194. package/dist/tests/evaluation-profile.test.js +0 -92
  195. package/dist/tests/evaluation-profile.test.js.map +0 -1
  196. package/dist/tests/event.test.d.ts +0 -2
  197. package/dist/tests/event.test.d.ts.map +0 -1
  198. package/dist/tests/event.test.js +0 -300
  199. package/dist/tests/event.test.js.map +0 -1
  200. package/dist/tests/expression-disallowed-keyword-hint.test.d.ts +0 -2
  201. package/dist/tests/expression-disallowed-keyword-hint.test.d.ts.map +0 -1
  202. package/dist/tests/expression-disallowed-keyword-hint.test.js +0 -45
  203. package/dist/tests/expression-disallowed-keyword-hint.test.js.map +0 -1
  204. package/dist/tests/expression-forbidden-hint.test.d.ts +0 -2
  205. package/dist/tests/expression-forbidden-hint.test.d.ts.map +0 -1
  206. package/dist/tests/expression-forbidden-hint.test.js +0 -37
  207. package/dist/tests/expression-forbidden-hint.test.js.map +0 -1
  208. package/dist/tests/expression.test.d.ts +0 -2
  209. package/dist/tests/expression.test.d.ts.map +0 -1
  210. package/dist/tests/expression.test.js +0 -482
  211. package/dist/tests/expression.test.js.map +0 -1
  212. package/dist/tests/fetch-and-procedure-scenarios.test.d.ts +0 -2
  213. package/dist/tests/fetch-and-procedure-scenarios.test.d.ts.map +0 -1
  214. package/dist/tests/fetch-and-procedure-scenarios.test.js +0 -195
  215. package/dist/tests/fetch-and-procedure-scenarios.test.js.map +0 -1
  216. package/dist/tests/form-number-type.test.d.ts +0 -2
  217. package/dist/tests/form-number-type.test.d.ts.map +0 -1
  218. package/dist/tests/form-number-type.test.js +0 -83
  219. package/dist/tests/form-number-type.test.js.map +0 -1
  220. package/dist/tests/form.test.d.ts +0 -2
  221. package/dist/tests/form.test.d.ts.map +0 -1
  222. package/dist/tests/form.test.js +0 -636
  223. package/dist/tests/form.test.js.map +0 -1
  224. package/dist/tests/fragment.test.d.ts +0 -2
  225. package/dist/tests/fragment.test.d.ts.map +0 -1
  226. package/dist/tests/fragment.test.js +0 -284
  227. package/dist/tests/fragment.test.js.map +0 -1
  228. package/dist/tests/haori.test.d.ts +0 -2
  229. package/dist/tests/haori.test.d.ts.map +0 -1
  230. package/dist/tests/haori.test.js +0 -149
  231. package/dist/tests/haori.test.js.map +0 -1
  232. package/dist/tests/helpers/async.d.ts +0 -20
  233. package/dist/tests/helpers/async.d.ts.map +0 -1
  234. package/dist/tests/helpers/async.js +0 -35
  235. package/dist/tests/helpers/async.js.map +0 -1
  236. package/dist/tests/import.test.d.ts +0 -2
  237. package/dist/tests/import.test.d.ts.map +0 -1
  238. package/dist/tests/import.test.js +0 -148
  239. package/dist/tests/import.test.js.map +0 -1
  240. package/dist/tests/intersect.test.d.ts +0 -2
  241. package/dist/tests/intersect.test.d.ts.map +0 -1
  242. package/dist/tests/intersect.test.js +0 -173
  243. package/dist/tests/intersect.test.js.map +0 -1
  244. package/dist/tests/log.test.d.ts +0 -2
  245. package/dist/tests/log.test.d.ts.map +0 -1
  246. package/dist/tests/log.test.js +0 -58
  247. package/dist/tests/log.test.js.map +0 -1
  248. package/dist/tests/observer.test.d.ts +0 -2
  249. package/dist/tests/observer.test.d.ts.map +0 -1
  250. package/dist/tests/observer.test.js +0 -64
  251. package/dist/tests/observer.test.js.map +0 -1
  252. package/dist/tests/placeholder-resolution.test.d.ts +0 -2
  253. package/dist/tests/placeholder-resolution.test.d.ts.map +0 -1
  254. package/dist/tests/placeholder-resolution.test.js +0 -463
  255. package/dist/tests/placeholder-resolution.test.js.map +0 -1
  256. package/dist/tests/procedure-action-operations.test.d.ts +0 -2
  257. package/dist/tests/procedure-action-operations.test.d.ts.map +0 -1
  258. package/dist/tests/procedure-action-operations.test.js +0 -1140
  259. package/dist/tests/procedure-action-operations.test.js.map +0 -1
  260. package/dist/tests/procedure-bind-append.test.d.ts +0 -2
  261. package/dist/tests/procedure-bind-append.test.d.ts.map +0 -1
  262. package/dist/tests/procedure-bind-append.test.js +0 -80
  263. package/dist/tests/procedure-bind-append.test.js.map +0 -1
  264. package/dist/tests/procedure-fetch-options.test.d.ts +0 -2
  265. package/dist/tests/procedure-fetch-options.test.d.ts.map +0 -1
  266. package/dist/tests/procedure-fetch-options.test.js +0 -255
  267. package/dist/tests/procedure-fetch-options.test.js.map +0 -1
  268. package/dist/tests/procedure.test.d.ts +0 -2
  269. package/dist/tests/procedure.test.d.ts.map +0 -1
  270. package/dist/tests/procedure.test.js +0 -137
  271. package/dist/tests/procedure.test.js.map +0 -1
  272. package/dist/tests/procedure_events.test.d.ts +0 -7
  273. package/dist/tests/procedure_events.test.d.ts.map +0 -1
  274. package/dist/tests/procedure_events.test.js +0 -261
  275. package/dist/tests/procedure_events.test.js.map +0 -1
  276. package/dist/tests/render-wait.test.d.ts +0 -2
  277. package/dist/tests/render-wait.test.d.ts.map +0 -1
  278. package/dist/tests/render-wait.test.js +0 -68
  279. package/dist/tests/render-wait.test.js.map +0 -1
  280. package/dist/tests/reset_each.test.d.ts +0 -2
  281. package/dist/tests/reset_each.test.d.ts.map +0 -1
  282. package/dist/tests/reset_each.test.js +0 -215
  283. package/dist/tests/reset_each.test.js.map +0 -1
  284. package/dist/tests/row-move.test.d.ts +0 -2
  285. package/dist/tests/row-move.test.d.ts.map +0 -1
  286. package/dist/tests/row-move.test.js +0 -220
  287. package/dist/tests/row-move.test.js.map +0 -1
  288. package/dist/tests/row-operations.test.d.ts +0 -2
  289. package/dist/tests/row-operations.test.d.ts.map +0 -1
  290. package/dist/tests/row-operations.test.js +0 -259
  291. package/dist/tests/row-operations.test.js.map +0 -1
  292. package/dist/tests/scheduled-evaluate-wait.test.d.ts +0 -2
  293. package/dist/tests/scheduled-evaluate-wait.test.d.ts.map +0 -1
  294. package/dist/tests/scheduled-evaluate-wait.test.js +0 -68
  295. package/dist/tests/scheduled-evaluate-wait.test.js.map +0 -1
  296. package/dist/tests/url.test.d.ts +0 -2
  297. package/dist/tests/url.test.d.ts.map +0 -1
  298. package/dist/tests/url.test.js +0 -150
  299. package/dist/tests/url.test.js.map +0 -1
  300. package/dist/vite.config.d.ts +0 -3
  301. package/dist/vite.config.d.ts.map +0 -1
  302. package/dist/vite.config.js +0 -28
  303. package/dist/vite.config.js.map +0 -1
  304. package/dist/vitest.config.d.ts +0 -3
  305. package/dist/vitest.config.d.ts.map +0 -1
  306. package/dist/vitest.config.js +0 -19
  307. 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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data-fetch-tbody-dom.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data-form-container.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data-if-dev-diagnostics.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data-if-falsy.test.d.ts.map
@@ -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":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data-load-on-show.test.d.ts.map
@@ -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":""}