haori 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +157 -0
  3. package/README.md +158 -0
  4. package/dist/haori.cjs.js +13 -0
  5. package/dist/haori.cjs.js.map +1 -0
  6. package/dist/haori.es.js +2929 -0
  7. package/dist/haori.es.js.map +1 -0
  8. package/dist/haori.iife.js +13 -0
  9. package/dist/haori.iife.js.map +1 -0
  10. package/dist/index.d.ts +824 -0
  11. package/dist/src/core.d.ts +144 -0
  12. package/dist/src/core.d.ts.map +1 -0
  13. package/dist/src/core.js +605 -0
  14. package/dist/src/core.js.map +1 -0
  15. package/dist/src/dev.d.ts +35 -0
  16. package/dist/src/dev.d.ts.map +1 -0
  17. package/dist/src/dev.js +44 -0
  18. package/dist/src/dev.js.map +1 -0
  19. package/dist/src/env.d.ts +25 -0
  20. package/dist/src/env.d.ts.map +1 -0
  21. package/dist/src/env.js +64 -0
  22. package/dist/src/env.js.map +1 -0
  23. package/dist/src/event.d.ts +144 -0
  24. package/dist/src/event.d.ts.map +1 -0
  25. package/dist/src/event.js +221 -0
  26. package/dist/src/event.js.map +1 -0
  27. package/dist/src/event_dispatcher.d.ts +50 -0
  28. package/dist/src/event_dispatcher.d.ts.map +1 -0
  29. package/dist/src/event_dispatcher.js +99 -0
  30. package/dist/src/event_dispatcher.js.map +1 -0
  31. package/dist/src/expression.d.ts +39 -0
  32. package/dist/src/expression.d.ts.map +1 -0
  33. package/dist/src/expression.js +148 -0
  34. package/dist/src/expression.js.map +1 -0
  35. package/dist/src/form.d.ts +113 -0
  36. package/dist/src/form.d.ts.map +1 -0
  37. package/dist/src/form.js +361 -0
  38. package/dist/src/form.js.map +1 -0
  39. package/dist/src/fragment.d.ts +427 -0
  40. package/dist/src/fragment.d.ts.map +1 -0
  41. package/dist/src/fragment.js +1168 -0
  42. package/dist/src/fragment.js.map +1 -0
  43. package/dist/src/haori.d.ts +54 -0
  44. package/dist/src/haori.d.ts.map +1 -0
  45. package/dist/src/haori.js +120 -0
  46. package/dist/src/haori.js.map +1 -0
  47. package/dist/src/import.d.ts +19 -0
  48. package/dist/src/import.d.ts.map +1 -0
  49. package/dist/src/import.js +64 -0
  50. package/dist/src/import.js.map +1 -0
  51. package/dist/src/index.d.ts +17 -0
  52. package/dist/src/index.d.ts.map +1 -0
  53. package/dist/src/index.js +21 -0
  54. package/dist/src/index.js.map +1 -0
  55. package/dist/src/log.d.ts +32 -0
  56. package/dist/src/log.d.ts.map +1 -0
  57. package/dist/src/log.js +43 -0
  58. package/dist/src/log.js.map +1 -0
  59. package/dist/src/observer.d.ts +17 -0
  60. package/dist/src/observer.d.ts.map +1 -0
  61. package/dist/src/observer.js +102 -0
  62. package/dist/src/observer.js.map +1 -0
  63. package/dist/src/procedure.d.ts +203 -0
  64. package/dist/src/procedure.d.ts.map +1 -0
  65. package/dist/src/procedure.js +1040 -0
  66. package/dist/src/procedure.js.map +1 -0
  67. package/dist/src/queue.d.ts +28 -0
  68. package/dist/src/queue.d.ts.map +1 -0
  69. package/dist/src/queue.js +150 -0
  70. package/dist/src/queue.js.map +1 -0
  71. package/dist/src/url.d.ts +14 -0
  72. package/dist/src/url.d.ts.map +1 -0
  73. package/dist/src/url.js +22 -0
  74. package/dist/src/url.js.map +1 -0
  75. package/dist/tests/click-attributes.test.d.ts +2 -0
  76. package/dist/tests/click-attributes.test.d.ts.map +1 -0
  77. package/dist/tests/click-attributes.test.js +95 -0
  78. package/dist/tests/click-attributes.test.js.map +1 -0
  79. package/dist/tests/core.test.d.ts +5 -0
  80. package/dist/tests/core.test.d.ts.map +1 -0
  81. package/dist/tests/core.test.js +158 -0
  82. package/dist/tests/core.test.js.map +1 -0
  83. package/dist/tests/data-each-browserlike.test.d.ts +2 -0
  84. package/dist/tests/data-each-browserlike.test.d.ts.map +1 -0
  85. package/dist/tests/data-each-browserlike.test.js +48 -0
  86. package/dist/tests/data-each-browserlike.test.js.map +1 -0
  87. package/dist/tests/data-each-fragment-debug.test.d.ts +2 -0
  88. package/dist/tests/data-each-fragment-debug.test.d.ts.map +1 -0
  89. package/dist/tests/data-each-fragment-debug.test.js +119 -0
  90. package/dist/tests/data-each-fragment-debug.test.js.map +1 -0
  91. package/dist/tests/data-each-table.test.d.ts +2 -0
  92. package/dist/tests/data-each-table.test.d.ts.map +1 -0
  93. package/dist/tests/data-each-table.test.js +63 -0
  94. package/dist/tests/data-each-table.test.js.map +1 -0
  95. package/dist/tests/dev.test.d.ts +2 -0
  96. package/dist/tests/dev.test.d.ts.map +1 -0
  97. package/dist/tests/dev.test.js +51 -0
  98. package/dist/tests/dev.test.js.map +1 -0
  99. package/dist/tests/each_arg.test.d.ts +2 -0
  100. package/dist/tests/each_arg.test.d.ts.map +1 -0
  101. package/dist/tests/each_arg.test.js +41 -0
  102. package/dist/tests/each_arg.test.js.map +1 -0
  103. package/dist/tests/env.test.d.ts +2 -0
  104. package/dist/tests/env.test.d.ts.map +1 -0
  105. package/dist/tests/env.test.js +96 -0
  106. package/dist/tests/env.test.js.map +1 -0
  107. package/dist/tests/event.test.d.ts +2 -0
  108. package/dist/tests/event.test.d.ts.map +1 -0
  109. package/dist/tests/event.test.js +287 -0
  110. package/dist/tests/event.test.js.map +1 -0
  111. package/dist/tests/expression.test.d.ts +2 -0
  112. package/dist/tests/expression.test.d.ts.map +1 -0
  113. package/dist/tests/expression.test.js +281 -0
  114. package/dist/tests/expression.test.js.map +1 -0
  115. package/dist/tests/fetch-and-procedure-scenarios.test.d.ts +2 -0
  116. package/dist/tests/fetch-and-procedure-scenarios.test.d.ts.map +1 -0
  117. package/dist/tests/fetch-and-procedure-scenarios.test.js +133 -0
  118. package/dist/tests/fetch-and-procedure-scenarios.test.js.map +1 -0
  119. package/dist/tests/form.test.d.ts +2 -0
  120. package/dist/tests/form.test.d.ts.map +1 -0
  121. package/dist/tests/form.test.js +607 -0
  122. package/dist/tests/form.test.js.map +1 -0
  123. package/dist/tests/fragment.test.d.ts +2 -0
  124. package/dist/tests/fragment.test.d.ts.map +1 -0
  125. package/dist/tests/fragment.test.js +164 -0
  126. package/dist/tests/fragment.test.js.map +1 -0
  127. package/dist/tests/import.test.d.ts +2 -0
  128. package/dist/tests/import.test.d.ts.map +1 -0
  129. package/dist/tests/import.test.js +148 -0
  130. package/dist/tests/import.test.js.map +1 -0
  131. package/dist/tests/log.test.d.ts +2 -0
  132. package/dist/tests/log.test.d.ts.map +1 -0
  133. package/dist/tests/log.test.js +58 -0
  134. package/dist/tests/log.test.js.map +1 -0
  135. package/dist/tests/procedure-action-operations.test.d.ts +2 -0
  136. package/dist/tests/procedure-action-operations.test.d.ts.map +1 -0
  137. package/dist/tests/procedure-action-operations.test.js +148 -0
  138. package/dist/tests/procedure-action-operations.test.js.map +1 -0
  139. package/dist/tests/procedure-fetch-options.test.d.ts +2 -0
  140. package/dist/tests/procedure-fetch-options.test.d.ts.map +1 -0
  141. package/dist/tests/procedure-fetch-options.test.js +131 -0
  142. package/dist/tests/procedure-fetch-options.test.js.map +1 -0
  143. package/dist/tests/procedure.test.d.ts +2 -0
  144. package/dist/tests/procedure.test.d.ts.map +1 -0
  145. package/dist/tests/procedure.test.js +136 -0
  146. package/dist/tests/procedure.test.js.map +1 -0
  147. package/dist/tests/procedure_events.test.d.ts +7 -0
  148. package/dist/tests/procedure_events.test.d.ts.map +1 -0
  149. package/dist/tests/procedure_events.test.js +96 -0
  150. package/dist/tests/procedure_events.test.js.map +1 -0
  151. package/dist/tests/reset_each.test.d.ts +2 -0
  152. package/dist/tests/reset_each.test.d.ts.map +1 -0
  153. package/dist/tests/reset_each.test.js +215 -0
  154. package/dist/tests/reset_each.test.js.map +1 -0
  155. package/dist/tests/row-move.test.d.ts +2 -0
  156. package/dist/tests/row-move.test.d.ts.map +1 -0
  157. package/dist/tests/row-move.test.js +197 -0
  158. package/dist/tests/row-move.test.js.map +1 -0
  159. package/dist/tests/row-operations.test.d.ts +2 -0
  160. package/dist/tests/row-operations.test.d.ts.map +1 -0
  161. package/dist/tests/row-operations.test.js +238 -0
  162. package/dist/tests/row-operations.test.js.map +1 -0
  163. package/dist/tests/url.test.d.ts +2 -0
  164. package/dist/tests/url.test.d.ts.map +1 -0
  165. package/dist/tests/url.test.js +150 -0
  166. package/dist/tests/url.test.js.map +1 -0
  167. package/dist/vite.config.d.ts +3 -0
  168. package/dist/vite.config.d.ts.map +1 -0
  169. package/dist/vite.config.js +28 -0
  170. package/dist/vite.config.js.map +1 -0
  171. package/dist/vitest.config.d.ts +3 -0
  172. package/dist/vitest.config.d.ts.map +1 -0
  173. package/dist/vitest.config.js +19 -0
  174. package/dist/vitest.config.js.map +1 -0
  175. package/package.json +68 -0
@@ -0,0 +1,48 @@
1
+ /* @vitest-environment jsdom */
2
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
3
+ import Core from '../src/core';
4
+ import Queue from '../src/queue';
5
+ describe('data-each 実ブラウザ挙動テスト', () => {
6
+ let container;
7
+ beforeEach(() => {
8
+ container = document.createElement('div');
9
+ document.body.appendChild(container);
10
+ });
11
+ afterEach(() => {
12
+ document.body.removeChild(container);
13
+ });
14
+ it('data-bind + data-eachで複数行が生成される', async () => {
15
+ const root = document.createElement('div');
16
+ const bindData = {
17
+ users: [
18
+ { id: 1, name: '田中太郎', age: 25 },
19
+ { id: 2, name: '佐藤花子', age: 30 },
20
+ ],
21
+ };
22
+ root.setAttribute('data-bind', JSON.stringify(bindData));
23
+ root.innerHTML = `
24
+ <table>
25
+ <tbody data-each="users">
26
+ <tr>
27
+ <td>{{id}}</td>
28
+ <td>{{name}}</td>
29
+ <td>{{age}}歳</td>
30
+ </tr>
31
+ </tbody>
32
+ </table>
33
+ `;
34
+ container.appendChild(root);
35
+ // ブラウザ同様、Core.scanのみ呼ぶ
36
+ await Core.scan(root);
37
+ await Queue.wait();
38
+ // tbodyのtrが2行生成されているか
39
+ const tbody = container.querySelector('tbody');
40
+ const rows = tbody?.querySelectorAll('tr');
41
+ expect(rows?.length).toBe(2);
42
+ if (rows && rows.length === 2) {
43
+ expect(rows[0].textContent).toContain('田中太郎');
44
+ expect(rows[1].textContent).toContain('佐藤花子');
45
+ }
46
+ });
47
+ });
48
+ //# sourceMappingURL=data-each-browserlike.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-each-browserlike.test.js","sourceRoot":"","sources":["../../tests/data-each-browserlike.test.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,QAAQ,CAAC;AACnE,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,OAAO,KAAK,MAAM,cAAc,CAAC;AAEjC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,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;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE;gBACL,EAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAC;gBAC9B,EAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAC;aAC/B;SACF,CAAC;QAEF,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS,GAAG;;;;;;;;;;KAUhB,CAAC;QACF,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,uBAAuB;QACvB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAEnB,sBAAsB;QACtB,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data-each-fragment-debug.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-each-fragment-debug.test.d.ts","sourceRoot":"","sources":["../../tests/data-each-fragment-debug.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,119 @@
1
+ /* @vitest-environment jsdom */
2
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
3
+ import Core from '../src/core';
4
+ import Queue from '../src/queue';
5
+ import Fragment, { ElementFragment } from '../src/fragment';
6
+ // usersデータ
7
+ const users = [
8
+ { id: 1, name: '田中太郎', age: 25 },
9
+ { id: 2, name: '佐藤花子', age: 30 },
10
+ ];
11
+ describe('data-each内部処理デバッグ', () => {
12
+ let container;
13
+ beforeEach(() => {
14
+ container = document.createElement('div');
15
+ document.body.appendChild(container);
16
+ });
17
+ afterEach(() => {
18
+ document.body.removeChild(container);
19
+ });
20
+ it('テンプレートtrがchildrenから正しく切り離されるか', async () => {
21
+ container.innerHTML = `
22
+ <table>
23
+ <tbody data-each="users">
24
+ <tr>
25
+ <td>{{id}}</td>
26
+ <td>{{name}}</td>
27
+ <td>{{age}}</td>
28
+ </tr>
29
+ </tbody>
30
+ </table>
31
+ `;
32
+ const tbody = container.querySelector('tbody');
33
+ const fragment = Fragment.get(tbody);
34
+ fragment.setBindingData({ users });
35
+ fragment.setMounted(true);
36
+ await Core.evaluateEach(fragment);
37
+ await Queue.wait();
38
+ // テンプレートtrがchildrenから除去されているか
39
+ const children = fragment.getChildren();
40
+ const filtered = children.filter(c => c instanceof ElementFragment);
41
+ const trCount = filtered.length;
42
+ expect(trCount).toBe(2); // 2行生成されている
43
+ });
44
+ it('テンプレートtrがsetTemplateで保存されているか', async () => {
45
+ container.innerHTML = `
46
+ <table>
47
+ <tbody data-each="users">
48
+ <tr>
49
+ <td>{{id}}</td>
50
+ <td>{{name}}</td>
51
+ <td>{{age}}</td>
52
+ </tr>
53
+ </tbody>
54
+ </table>
55
+ `;
56
+ const tbody = container.querySelector('tbody');
57
+ const fragment = Fragment.get(tbody);
58
+ fragment.setBindingData({ users });
59
+ fragment.setMounted(true);
60
+ await Core.evaluateEach(fragment);
61
+ await Queue.wait();
62
+ const template = fragment.getTemplate();
63
+ expect(template).not.toBeNull();
64
+ expect(template?.getTarget().nodeName).toBe('TR');
65
+ });
66
+ it('newKeysの数がusers配列と一致するか', async () => {
67
+ container.innerHTML = `
68
+ <table>
69
+ <tbody data-each="users">
70
+ <tr>
71
+ <td>{{id}}</td>
72
+ <td>{{name}}</td>
73
+ <td>{{age}}</td>
74
+ </tr>
75
+ </tbody>
76
+ </table>
77
+ `;
78
+ const tbody = container.querySelector('tbody');
79
+ const fragment = Fragment.get(tbody);
80
+ fragment.setBindingData({ users });
81
+ fragment.setMounted(true);
82
+ // updateDiff内部のnewKeys数を確認
83
+ let newKeysCount = 0;
84
+ const origUpdateDiff = Core.updateDiff;
85
+ Core.updateDiff = function (parent, newList) {
86
+ newKeysCount = newList.length;
87
+ const fn = origUpdateDiff;
88
+ return fn.apply(this, [parent, newList]);
89
+ };
90
+ await Core.evaluateEach(fragment);
91
+ await Queue.wait();
92
+ expect(newKeysCount).toBe(users.length);
93
+ Core.updateDiff = origUpdateDiff;
94
+ });
95
+ it('rowFragmentにバインディングデータが正しくセットされるか', async () => {
96
+ container.innerHTML = `
97
+ <table>
98
+ <tbody data-each="users">
99
+ <tr><td>{{id}}</td><td>{{name}}</td><td>{{age}}</td></tr>
100
+ </tbody>
101
+ </table>
102
+ `;
103
+ const tbody = container.querySelector('tbody');
104
+ const fragment = Fragment.get(tbody);
105
+ fragment.setBindingData({ users });
106
+ fragment.setMounted(true);
107
+ await Core.evaluateEach(fragment);
108
+ await Queue.wait();
109
+ const rows = tbody.querySelectorAll('tr');
110
+ expect(rows.length).toBe(users.length);
111
+ // 1行目のFragmentのバインディングデータを確認
112
+ const rowFragment = Fragment.get(rows[0]);
113
+ const binding = rowFragment.getBindingData();
114
+ expect(binding.id).toBe(1);
115
+ expect(binding.name).toBe('田中太郎');
116
+ expect(binding.age).toBe(25);
117
+ });
118
+ });
119
+ //# sourceMappingURL=data-each-fragment-debug.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-each-fragment-debug.test.js","sourceRoot":"","sources":["../../tests/data-each-fragment-debug.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data-each-table.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-each-table.test.d.ts","sourceRoot":"","sources":["../../tests/data-each-table.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ /* @vitest-environment jsdom */
2
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
3
+ import Core from '../src/core';
4
+ import Queue from '../src/queue';
5
+ // Fragment はこのテストで直接使用しないためインポートを削除
6
+ describe('data-each with tbody element', () => {
7
+ let container;
8
+ beforeEach(() => {
9
+ container = document.createElement('div');
10
+ document.body.appendChild(container);
11
+ });
12
+ afterEach(() => {
13
+ document.body.removeChild(container);
14
+ });
15
+ it('tbodyにdata-each属性を設定した場合、trがテンプレートとして使われる', async () => {
16
+ const root = document.createElement('div');
17
+ const bindData = {
18
+ users: [
19
+ { id: 1, name: '田中太郎', age: 25 },
20
+ { id: 2, name: '佐藤花子', age: 30 },
21
+ ],
22
+ };
23
+ root.setAttribute('data-bind', JSON.stringify(bindData));
24
+ root.innerHTML = `
25
+ <table>
26
+ <tbody data-each="users" data-each-key="id">
27
+ <tr>
28
+ <td>{{id}}</td>
29
+ <td>{{name}}</td>
30
+ <td>{{age}}歳</td>
31
+ </tr>
32
+ </tbody>
33
+ </table>
34
+ `;
35
+ container.appendChild(root);
36
+ // markMountedは呼ばず、Core.scanのみ
37
+ await Core.scan(root);
38
+ await Queue.wait();
39
+ // ポーリングで最終状態を確認
40
+ for (let i = 0; i < 10; i++) {
41
+ const tbody = container.querySelector('tbody');
42
+ const rows = tbody?.querySelectorAll('tr');
43
+ if (rows && rows.length === 2) {
44
+ break;
45
+ }
46
+ await new Promise(resolve => setTimeout(resolve, 10));
47
+ }
48
+ const tbody = container.querySelector('tbody');
49
+ expect(tbody).not.toBeNull();
50
+ // tbodyの子要素としてtrが生成されているか確認
51
+ const rows = tbody?.querySelectorAll('tr');
52
+ console.log('Generated rows:', rows?.length);
53
+ console.log('tbody innerHTML:', tbody?.innerHTML);
54
+ if (rows && rows.length > 0) {
55
+ console.log('First row content:', rows[0].innerHTML);
56
+ if (rows.length > 1) {
57
+ console.log('Second row content:', rows[1].innerHTML);
58
+ }
59
+ }
60
+ expect(rows?.length).toBe(2);
61
+ });
62
+ });
63
+ //# sourceMappingURL=data-each-table.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-each-table.test.js","sourceRoot":"","sources":["../../tests/data-each-table.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dev.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.test.d.ts","sourceRoot":"","sources":["../../tests/dev.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import Dev from '../src/dev';
3
+ describe('Dev', () => {
4
+ beforeEach(() => {
5
+ // 各テスト前に開発モードを確実に無効化
6
+ Dev.disable();
7
+ });
8
+ afterEach(() => {
9
+ // 各テスト後にも状態をクリーンアップ
10
+ Dev.disable();
11
+ });
12
+ describe('isEnabled', () => {
13
+ it('初期状態では無効になっている', () => {
14
+ expect(Dev.isEnabled()).toBe(false);
15
+ });
16
+ it('有効化後は true を返す', () => {
17
+ expect(Dev.isEnabled()).toBe(false); // 初期状態確認
18
+ Dev.enable();
19
+ expect(Dev.isEnabled()).toBe(true);
20
+ });
21
+ });
22
+ describe('enable', () => {
23
+ it('開発モードを有効化する', () => {
24
+ expect(Dev.isEnabled()).toBe(false); // 初期状態確認
25
+ Dev.enable();
26
+ expect(Dev.isEnabled()).toBe(true);
27
+ });
28
+ });
29
+ describe('disable', () => {
30
+ it('開発モードを無効化する', () => {
31
+ Dev.enable();
32
+ expect(Dev.isEnabled()).toBe(true); // 有効化確認
33
+ Dev.disable();
34
+ expect(Dev.isEnabled()).toBe(false);
35
+ });
36
+ });
37
+ describe('set', () => {
38
+ it('true を渡すと有効化される', () => {
39
+ expect(Dev.isEnabled()).toBe(false); // 初期状態確認
40
+ Dev.set(true);
41
+ expect(Dev.isEnabled()).toBe(true);
42
+ });
43
+ it('false を渡すと無効化される', () => {
44
+ Dev.enable(); // 一度有効化
45
+ expect(Dev.isEnabled()).toBe(true); // 有効化確認
46
+ Dev.set(false);
47
+ expect(Dev.isEnabled()).toBe(false);
48
+ });
49
+ });
50
+ });
51
+ //# sourceMappingURL=dev.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.test.js","sourceRoot":"","sources":["../../tests/dev.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,QAAQ,CAAC;AACnE,OAAO,GAAG,MAAM,YAAY,CAAC;AAE7B,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,UAAU,CAAC,GAAG,EAAE;QACd,qBAAqB;QACrB,GAAG,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,oBAAoB;QACpB,GAAG,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC9C,GAAG,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YACrB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC9C,GAAG,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YACrB,GAAG,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;YAC5C,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;QACnB,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC9C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAC1B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ;YACtB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;YAC5C,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=each_arg.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"each_arg.test.d.ts","sourceRoot":"","sources":["../../tests/each_arg.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import Core from '../src/core';
3
+ import Queue from '../src/queue';
4
+ import Fragment from '../src/fragment';
5
+ describe('data-each-arg の適用(プリミティブ配列のバインディング)', () => {
6
+ const markMounted = (f) => {
7
+ f.setMounted(true);
8
+ f.getChildElementFragments().forEach(child => markMounted(child));
9
+ };
10
+ it('プリミティブ配列 + each-arg で {{item}} が展開される', async () => {
11
+ const container = document.createElement('div');
12
+ document.body.appendChild(container);
13
+ const each = document.createElement('div');
14
+ each.setAttribute('data-each', '["A","B"]');
15
+ each.setAttribute('data-each-arg', 'item');
16
+ const child = document.createElement('span');
17
+ child.textContent = '{{item}}';
18
+ each.appendChild(child);
19
+ container.appendChild(each);
20
+ const frag = Fragment.get(each);
21
+ markMounted(frag);
22
+ await Core.evaluateAll(frag);
23
+ // キューに積まれたDOM更新が完了するまで待機
24
+ await Queue.wait();
25
+ // 念のためポーリングで最終状態を確認
26
+ for (let i = 0; i < 10; i++) {
27
+ const count = each.querySelectorAll('span').length;
28
+ if (count === 2) {
29
+ break;
30
+ }
31
+ await new Promise(resolve => setTimeout(resolve, 5));
32
+ }
33
+ const spans = Array.from(each.querySelectorAll('span'));
34
+ // 2つのクローン(テンプレート以外)が存在し、テキストが A, B に評価される
35
+ expect(spans.length).toBe(2);
36
+ expect(spans[0].textContent).toBe('A');
37
+ expect(spans[1].textContent).toBe('B');
38
+ container.remove();
39
+ });
40
+ });
41
+ //# sourceMappingURL=each_arg.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"each_arg.test.js","sourceRoot":"","sources":["../../tests/each_arg.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,QAAQ,CAAC;AAC5C,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,OAAO,KAAK,MAAM,cAAc,CAAC;AACjC,OAAO,QAA2B,MAAM,iBAAiB,CAAC;AAE1D,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,MAAM,WAAW,GAAG,CAAC,CAAkB,EAAE,EAAE;QACzC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC,wBAAwB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC;IAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7C,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxB,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAE5B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAoB,CAAC;QACnD,WAAW,CAAC,IAAI,CAAC,CAAC;QAElB,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,yBAAyB;QACzB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,oBAAoB;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YACnD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,MAAM;YACR,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CACT,CAAC;QACvB,0CAA0C;QAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvC,SAAS,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=env.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.test.d.ts","sourceRoot":"","sources":["../../tests/env.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
1
+ import Dev from '../src/dev';
2
+ import Env from '../src/env';
3
+ describe('環境から開発モードを検出します', () => {
4
+ beforeEach(() => {
5
+ Dev.set(false);
6
+ document.querySelectorAll('script').forEach(script => script.remove());
7
+ Object.defineProperty(window, 'location', {
8
+ value: new URL('http://test.com'),
9
+ writable: true,
10
+ });
11
+ });
12
+ /**
13
+ * scriptタグを追加します。
14
+ *
15
+ * @param attr scriptタグに設定する属性名
16
+ * @param src scriptタグのsrc属性
17
+ * @param value 属性の値(省略可能)
18
+ */
19
+ function mockScriptWithAttribute(attr, src, value) {
20
+ const script = document.createElement('script');
21
+ if (value !== undefined) {
22
+ script.setAttribute(attr, value);
23
+ }
24
+ else {
25
+ script.setAttribute(attr, '');
26
+ }
27
+ script.src = src;
28
+ document.body.appendChild(script);
29
+ }
30
+ /**
31
+ * ホスト名をモックします。
32
+ *
33
+ * @param hostname モックするホスト名
34
+ */
35
+ function mockHostname(hostname) {
36
+ Object.defineProperty(window, 'location', {
37
+ value: { hostname: hostname, href: `http://${hostname}` },
38
+ writable: true,
39
+ });
40
+ }
41
+ it('data-dev属性がある場合', () => {
42
+ mockScriptWithAttribute('data-dev', 'haori.js');
43
+ Env.detect();
44
+ expect(Dev.isEnabled()).toBe(true);
45
+ });
46
+ it('data-prefix="hor"属性がある場合', () => {
47
+ const script = document.createElement('script');
48
+ script.setAttribute('data-prefix', 'hor');
49
+ script.setAttribute('hor-dev', '');
50
+ script.src = 'haori.js';
51
+ document.body.appendChild(script);
52
+ Env.detect();
53
+ expect(Dev.isEnabled()).toBe(true);
54
+ });
55
+ it('hor-dev属性がある場合', () => {
56
+ mockScriptWithAttribute('hor-dev', 'haori.js');
57
+ Env.detect();
58
+ expect(Dev.isEnabled()).toBe(true);
59
+ });
60
+ it('localhostの場合', () => {
61
+ mockHostname('localhost');
62
+ Env.detect();
63
+ expect(Dev.isEnabled()).toBe(true);
64
+ });
65
+ it('127.0.0.1の場合', () => {
66
+ mockHostname('127.0.0.1');
67
+ Env.detect();
68
+ expect(Dev.isEnabled()).toBe(true);
69
+ });
70
+ it('::1の場合', () => {
71
+ mockHostname('::1');
72
+ Env.detect();
73
+ expect(Dev.isEnabled()).toBe(true);
74
+ });
75
+ it('*.localの場合', () => {
76
+ mockHostname('test.local');
77
+ Env.detect();
78
+ expect(Dev.isEnabled()).toBe(true);
79
+ });
80
+ it('*.localhostの場合', () => {
81
+ mockHostname('test.localhost');
82
+ Env.detect();
83
+ expect(Dev.isEnabled()).toBe(true);
84
+ });
85
+ it('ローカルでないホスト名の場合', () => {
86
+ mockHostname('test.app');
87
+ Env.detect();
88
+ expect(Dev.isEnabled()).toBe(false);
89
+ });
90
+ it('無関係なスクリプトの場合', () => {
91
+ mockScriptWithAttribute('data-dev', 'other.js');
92
+ Env.detect();
93
+ expect(Dev.isEnabled()).toBe(false);
94
+ });
95
+ });
96
+ //# sourceMappingURL=env.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.test.js","sourceRoot":"","sources":["../../tests/env.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.test.d.ts","sourceRoot":"","sources":["../../tests/event.test.ts"],"names":[],"mappings":""}