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,44 @@
1
+ /**
2
+ * @fileoverview Haori開発モード管理機能
3
+ *
4
+ * 開発モードの有効/無効を管理し、デバッグ機能の制御を行います。
5
+ * プロダクション環境では開発向け機能を無効化することで、
6
+ * パフォーマンスとセキュリティを向上させます。
7
+ */
8
+ /**
9
+ * 開発モード管理クラスです。
10
+ */
11
+ class Dev {
12
+ /**
13
+ * 開発モードの状態を取得します。
14
+ *
15
+ * @returns 開発モードならtrue、そうでなければfalse
16
+ */
17
+ static isEnabled() {
18
+ return Dev.devMode;
19
+ }
20
+ /**
21
+ * 開発モードを有効化します。
22
+ */
23
+ static enable() {
24
+ Dev.devMode = true;
25
+ }
26
+ /**
27
+ * 開発モードを無効化します。
28
+ */
29
+ static disable() {
30
+ Dev.devMode = false;
31
+ }
32
+ /**
33
+ * 開発モードを切り替えます。
34
+ *
35
+ * @param enabled trueで有効化、falseで無効化
36
+ */
37
+ static set(enabled) {
38
+ Dev.devMode = enabled;
39
+ }
40
+ }
41
+ /** 開発モードフラグ */
42
+ Dev.devMode = false;
43
+ export default Dev;
44
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/dev.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAqB,GAAG;IAItB;;;;OAIG;IACH,MAAM,CAAC,SAAS;QACd,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO;QACZ,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,OAAgB;QACzB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;;AAjCD,eAAe;AACA,WAAO,GAAG,KAAK,CAAC;eAFZ,GAAG"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @fileoverview Haori環境検出機能
3
+ *
4
+ * 実行環境を管理します。
5
+ */
6
+ /**
7
+ * 実行環境を管理するクラスです。
8
+ */
9
+ export default class Env {
10
+ private static _prefix;
11
+ /**
12
+ * 実行環境からプレフィックスと開発モードかどうかを自動検出します。
13
+ * scriptタグにdata-prefixがある場合は、その値+"-"をプレフィックスとして使用します。
14
+ * scriptタグにdata-dev属性がある場合、
15
+ * もしくはローカルホスト系ドメインであれば開発モードを有効化します。
16
+ */
17
+ static detect(): void;
18
+ /**
19
+ * プレフィックスを取得します。
20
+ *
21
+ * @returns プレフィックス
22
+ */
23
+ static get prefix(): string;
24
+ }
25
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,GAAG;IACtB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAmB;IAEzC;;;;;OAKG;IACH,MAAM,CAAC,MAAM,IAAI,IAAI;IAqCrB;;;;OAIG;IACH,WAAkB,MAAM,IAAI,MAAM,CAEjC;CACF"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @fileoverview Haori環境検出機能
3
+ *
4
+ * 実行環境を管理します。
5
+ */
6
+ import Dev from './dev';
7
+ /**
8
+ * 実行環境を管理するクラスです。
9
+ */
10
+ class Env {
11
+ /**
12
+ * 実行環境からプレフィックスと開発モードかどうかを自動検出します。
13
+ * scriptタグにdata-prefixがある場合は、その値+"-"をプレフィックスとして使用します。
14
+ * scriptタグにdata-dev属性がある場合、
15
+ * もしくはローカルホスト系ドメインであれば開発モードを有効化します。
16
+ */
17
+ static detect() {
18
+ try {
19
+ const currentScript = document.currentScript ||
20
+ document.querySelector('script[src*="haori"]');
21
+ if (currentScript instanceof HTMLScriptElement) {
22
+ const prefix = currentScript.getAttribute('data-prefix') || Env._prefix;
23
+ Env._prefix = prefix.endsWith('-') ? prefix : prefix + '-';
24
+ }
25
+ if (currentScript instanceof HTMLScriptElement &&
26
+ currentScript.hasAttribute(`${Env._prefix}dev`)) {
27
+ Dev.set(true);
28
+ return;
29
+ }
30
+ // ローカルホスト系ドメインの場合
31
+ const host = window.location.hostname;
32
+ if (host === 'localhost' ||
33
+ host.endsWith('.localhost') ||
34
+ host === '127.0.0.1' ||
35
+ host === '::1' ||
36
+ host.endsWith('.local')) {
37
+ Dev.set(true);
38
+ return;
39
+ }
40
+ // それ以外は開発モードを無効化
41
+ Dev.set(false);
42
+ }
43
+ catch {
44
+ // SSRや非ブラウザ環境では無視
45
+ }
46
+ }
47
+ /**
48
+ * プレフィックスを取得します。
49
+ *
50
+ * @returns プレフィックス
51
+ */
52
+ static get prefix() {
53
+ return Env._prefix;
54
+ }
55
+ }
56
+ Env._prefix = 'data-';
57
+ export default Env;
58
+ if (document.readyState === 'loading') {
59
+ document.addEventListener('DOMContentLoaded', Env.detect);
60
+ }
61
+ else {
62
+ Env.detect();
63
+ }
64
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,GAAG,MAAM,OAAO,CAAC;AAExB;;GAEG;AACH,MAAqB,GAAG;IAGtB;;;;;OAKG;IACH,MAAM,CAAC,MAAM;QACX,IAAI,CAAC;YACH,MAAM,aAAa,GACjB,QAAQ,CAAC,aAAa;gBACtB,QAAQ,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;YACjD,IAAI,aAAa,YAAY,iBAAiB,EAAE,CAAC;gBAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC;gBACxE,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;YAC7D,CAAC;YACD,IACE,aAAa,YAAY,iBAAiB;gBAC1C,aAAa,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,OAAO,KAAK,CAAC,EAC/C,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,kBAAkB;YAClB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtC,IACE,IAAI,KAAK,WAAW;gBACpB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAC3B,IAAI,KAAK,WAAW;gBACpB,IAAI,KAAK,KAAK;gBACd,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACvB,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,iBAAiB;YACjB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,MAAM,KAAK,MAAM;QACtB,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;;AApDc,WAAO,GAAW,OAAO,CAAC;eADtB,GAAG;AAwDxB,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5D,CAAC;KAAM,CAAC;IACN,GAAG,CAAC,MAAM,EAAE,CAAC;AACf,CAAC"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @fileoverview Haoriイベント発火ユーティリティ
3
+ *
4
+ * Haoriライブラリが発火するカスタムイベントの統一的な発火機能を提供します。
5
+ */
6
+ /**
7
+ * Haoriイベントを発火するユーティリティクラス
8
+ */
9
+ export default class HaoriEvent {
10
+ /**
11
+ * カスタムイベントを発火します。
12
+ *
13
+ * @param target イベントを発火する対象要素
14
+ * @param eventName イベント名(haori:プレフィックスは自動追加)
15
+ * @param detail イベントの詳細データ
16
+ * @param options イベントオプション
17
+ */
18
+ static dispatch(target: EventTarget, eventName: string, detail?: unknown, options?: {
19
+ bubbles?: boolean;
20
+ cancelable?: boolean;
21
+ composed?: boolean;
22
+ }): boolean;
23
+ /**
24
+ * readyイベントを発火します。
25
+ *
26
+ * @param version ライブラリバージョン
27
+ */
28
+ static ready(version?: string): void;
29
+ /**
30
+ * renderイベントを発火します。
31
+ *
32
+ * @param target 評価対象要素
33
+ */
34
+ static render(target: HTMLElement): void;
35
+ /**
36
+ * importstartイベントを発火します。
37
+ *
38
+ * @param target data-import要素
39
+ * @param url インポート対象URL
40
+ */
41
+ static importStart(target: HTMLElement, url: string): void;
42
+ /**
43
+ * importendイベントを発火します。
44
+ *
45
+ * @param target data-import要素
46
+ * @param url インポート対象URL
47
+ * @param bytes 取得バイト数
48
+ * @param startedAt 開始時刻
49
+ */
50
+ static importEnd(target: HTMLElement, url: string, bytes: number, startedAt: number): void;
51
+ /**
52
+ * importerrorイベントを発火します。
53
+ *
54
+ * @param target data-import要素
55
+ * @param url インポート対象URL
56
+ * @param error エラー内容
57
+ */
58
+ static importError(target: HTMLElement, url: string, error: unknown): void;
59
+ /**
60
+ * bindchangeイベントを発火します。
61
+ *
62
+ * @param target バインド対象要素
63
+ * @param previous 変更前のデータ
64
+ * @param next 変更後のデータ
65
+ * @param reason 変更理由
66
+ */
67
+ static bindChange(target: HTMLElement, previous: Record<string, unknown> | null, next: Record<string, unknown>, reason?: 'form' | 'fetch' | 'manual' | 'import' | 'other'): void;
68
+ /**
69
+ * eachupdateイベントを発火します。
70
+ *
71
+ * @param target data-each要素
72
+ * @param added 追加された行のキー
73
+ * @param removed 削除された行のキー
74
+ * @param order 現在の順序
75
+ */
76
+ static eachUpdate(target: HTMLElement, added: string[], removed: string[], order: string[]): void;
77
+ /**
78
+ * rowaddイベントを発火します。
79
+ *
80
+ * @param target 行要素
81
+ * @param key 行キー
82
+ * @param index インデックス
83
+ * @param item 行データ
84
+ */
85
+ static rowAdd(target: HTMLElement, key: string, index: number, item: unknown): void;
86
+ /**
87
+ * rowremoveイベントを発火します。
88
+ *
89
+ * @param target 行要素
90
+ * @param key 行キー
91
+ * @param index インデックス
92
+ */
93
+ static rowRemove(target: HTMLElement, key: string, index: number): void;
94
+ /**
95
+ * rowmoveイベントを発火します。
96
+ *
97
+ * @param target 行要素
98
+ * @param key 行キー
99
+ * @param from 移動前インデックス
100
+ * @param to 移動後インデックス
101
+ */
102
+ static rowMove(target: HTMLElement, key: string, from: number, to: number): void;
103
+ /**
104
+ * showイベントを発火します。
105
+ *
106
+ * @param target data-if要素
107
+ */
108
+ static show(target: HTMLElement): void;
109
+ /**
110
+ * hideイベントを発火します。
111
+ *
112
+ * @param target data-if要素
113
+ */
114
+ static hide(target: HTMLElement): void;
115
+ /**
116
+ * fetchstartイベントを発火します。
117
+ *
118
+ * @param target 起点要素
119
+ * @param url フェッチURL
120
+ * @param options フェッチオプション
121
+ * @param payload 送信データ
122
+ */
123
+ static fetchStart(target: HTMLElement, url: string, options?: RequestInit, payload?: Record<string, unknown>): void;
124
+ /**
125
+ * fetchendイベントを発火します。
126
+ *
127
+ * @param target 起点要素
128
+ * @param url フェッチURL
129
+ * @param status HTTPステータス
130
+ * @param startedAt 開始時刻
131
+ */
132
+ static fetchEnd(target: HTMLElement, url: string, status: number, startedAt: number): void;
133
+ /**
134
+ * fetcherrorイベントを発火します。
135
+ *
136
+ * @param target 起点要素
137
+ * @param url フェッチURL
138
+ * @param error エラー内容
139
+ * @param status HTTPステータス(存在する場合)
140
+ * @param startedAt 開始時刻(存在する場合)
141
+ */
142
+ static fetchError(target: HTMLElement, url: string, error: unknown, status?: number, startedAt?: number): void;
143
+ }
144
+ //# sourceMappingURL=event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/event.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B;;;;;;;OAOG;WACW,QAAQ,CACpB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,GACA,OAAO;IAWV;;;;OAIG;WACW,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAI3C;;;;OAIG;WACW,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAI/C;;;;;OAKG;WACW,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAOjE;;;;;;;OAOG;WACW,SAAS,CACrB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,IAAI;IAQP;;;;;;OAMG;WACW,WAAW,CACvB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,GACb,IAAI;IAIP;;;;;;;OAOG;WACW,UAAU,CACtB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,GAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAiB,GACjE,IAAI;IAwBP;;;;;;;OAOG;WACW,UAAU,CACtB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,EAAE,GACd,IAAI;IASP;;;;;;;OAOG;WACW,MAAM,CAClB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,GACZ,IAAI;IAIP;;;;;;OAMG;WACW,SAAS,CACrB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,IAAI;IAIP;;;;;;;OAOG;WACW,OAAO,CACnB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,IAAI;IAIP;;;;OAIG;WACW,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAI7C;;;;OAIG;WACW,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAI7C;;;;;;;OAOG;WACW,UAAU,CACtB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI;IASP;;;;;;;OAOG;WACW,QAAQ,CACpB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,IAAI;IAQP;;;;;;;;OAQG;WACW,UAAU,CACtB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;CAQR"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * @fileoverview Haoriイベント発火ユーティリティ
3
+ *
4
+ * Haoriライブラリが発火するカスタムイベントの統一的な発火機能を提供します。
5
+ */
6
+ /**
7
+ * Haoriイベントを発火するユーティリティクラス
8
+ */
9
+ export default class HaoriEvent {
10
+ /**
11
+ * カスタムイベントを発火します。
12
+ *
13
+ * @param target イベントを発火する対象要素
14
+ * @param eventName イベント名(haori:プレフィックスは自動追加)
15
+ * @param detail イベントの詳細データ
16
+ * @param options イベントオプション
17
+ */
18
+ static dispatch(target, eventName, detail, options) {
19
+ const event = new CustomEvent(`haori:${eventName}`, {
20
+ bubbles: options?.bubbles ?? true,
21
+ cancelable: options?.cancelable ?? false,
22
+ composed: options?.composed ?? true,
23
+ detail,
24
+ });
25
+ return target.dispatchEvent(event);
26
+ }
27
+ /**
28
+ * readyイベントを発火します。
29
+ *
30
+ * @param version ライブラリバージョン
31
+ */
32
+ static ready(version) {
33
+ HaoriEvent.dispatch(document, 'ready', { version });
34
+ }
35
+ /**
36
+ * renderイベントを発火します。
37
+ *
38
+ * @param target 評価対象要素
39
+ */
40
+ static render(target) {
41
+ HaoriEvent.dispatch(target, 'render', { target });
42
+ }
43
+ /**
44
+ * importstartイベントを発火します。
45
+ *
46
+ * @param target data-import要素
47
+ * @param url インポート対象URL
48
+ */
49
+ static importStart(target, url) {
50
+ HaoriEvent.dispatch(target, 'importstart', {
51
+ url,
52
+ startedAt: performance.now(),
53
+ });
54
+ }
55
+ /**
56
+ * importendイベントを発火します。
57
+ *
58
+ * @param target data-import要素
59
+ * @param url インポート対象URL
60
+ * @param bytes 取得バイト数
61
+ * @param startedAt 開始時刻
62
+ */
63
+ static importEnd(target, url, bytes, startedAt) {
64
+ HaoriEvent.dispatch(target, 'importend', {
65
+ url,
66
+ bytes,
67
+ durationMs: performance.now() - startedAt,
68
+ });
69
+ }
70
+ /**
71
+ * importerrorイベントを発火します。
72
+ *
73
+ * @param target data-import要素
74
+ * @param url インポート対象URL
75
+ * @param error エラー内容
76
+ */
77
+ static importError(target, url, error) {
78
+ HaoriEvent.dispatch(target, 'importerror', { url, error });
79
+ }
80
+ /**
81
+ * bindchangeイベントを発火します。
82
+ *
83
+ * @param target バインド対象要素
84
+ * @param previous 変更前のデータ
85
+ * @param next 変更後のデータ
86
+ * @param reason 変更理由
87
+ */
88
+ static bindChange(target, previous, next, reason = 'other') {
89
+ const changedKeys = [];
90
+ // 変更されたキーを検出
91
+ const prevKeys = new Set(Object.keys(previous || {}));
92
+ const nextKeys = new Set(Object.keys(next));
93
+ const allKeys = new Set([...prevKeys, ...nextKeys]);
94
+ for (const key of allKeys) {
95
+ const prevValue = previous?.[key];
96
+ const nextValue = next[key];
97
+ if (prevValue !== nextValue) {
98
+ changedKeys.push(key);
99
+ }
100
+ }
101
+ HaoriEvent.dispatch(target, 'bindchange', {
102
+ previous: previous || {},
103
+ next,
104
+ changedKeys,
105
+ reason,
106
+ });
107
+ }
108
+ /**
109
+ * eachupdateイベントを発火します。
110
+ *
111
+ * @param target data-each要素
112
+ * @param added 追加された行のキー
113
+ * @param removed 削除された行のキー
114
+ * @param order 現在の順序
115
+ */
116
+ static eachUpdate(target, added, removed, order) {
117
+ HaoriEvent.dispatch(target, 'eachupdate', {
118
+ added,
119
+ removed,
120
+ order,
121
+ total: order.length,
122
+ });
123
+ }
124
+ /**
125
+ * rowaddイベントを発火します。
126
+ *
127
+ * @param target 行要素
128
+ * @param key 行キー
129
+ * @param index インデックス
130
+ * @param item 行データ
131
+ */
132
+ static rowAdd(target, key, index, item) {
133
+ HaoriEvent.dispatch(target, 'rowadd', { key, index, item });
134
+ }
135
+ /**
136
+ * rowremoveイベントを発火します。
137
+ *
138
+ * @param target 行要素
139
+ * @param key 行キー
140
+ * @param index インデックス
141
+ */
142
+ static rowRemove(target, key, index) {
143
+ HaoriEvent.dispatch(target, 'rowremove', { key, index });
144
+ }
145
+ /**
146
+ * rowmoveイベントを発火します。
147
+ *
148
+ * @param target 行要素
149
+ * @param key 行キー
150
+ * @param from 移動前インデックス
151
+ * @param to 移動後インデックス
152
+ */
153
+ static rowMove(target, key, from, to) {
154
+ HaoriEvent.dispatch(target, 'rowmove', { key, from, to });
155
+ }
156
+ /**
157
+ * showイベントを発火します。
158
+ *
159
+ * @param target data-if要素
160
+ */
161
+ static show(target) {
162
+ HaoriEvent.dispatch(target, 'show', { visible: true });
163
+ }
164
+ /**
165
+ * hideイベントを発火します。
166
+ *
167
+ * @param target data-if要素
168
+ */
169
+ static hide(target) {
170
+ HaoriEvent.dispatch(target, 'hide', { visible: false });
171
+ }
172
+ /**
173
+ * fetchstartイベントを発火します。
174
+ *
175
+ * @param target 起点要素
176
+ * @param url フェッチURL
177
+ * @param options フェッチオプション
178
+ * @param payload 送信データ
179
+ */
180
+ static fetchStart(target, url, options, payload) {
181
+ HaoriEvent.dispatch(target, 'fetchstart', {
182
+ url,
183
+ options: options || {},
184
+ payload,
185
+ startedAt: performance.now(),
186
+ });
187
+ }
188
+ /**
189
+ * fetchendイベントを発火します。
190
+ *
191
+ * @param target 起点要素
192
+ * @param url フェッチURL
193
+ * @param status HTTPステータス
194
+ * @param startedAt 開始時刻
195
+ */
196
+ static fetchEnd(target, url, status, startedAt) {
197
+ HaoriEvent.dispatch(target, 'fetchend', {
198
+ url,
199
+ status,
200
+ durationMs: performance.now() - startedAt,
201
+ });
202
+ }
203
+ /**
204
+ * fetcherrorイベントを発火します。
205
+ *
206
+ * @param target 起点要素
207
+ * @param url フェッチURL
208
+ * @param error エラー内容
209
+ * @param status HTTPステータス(存在する場合)
210
+ * @param startedAt 開始時刻(存在する場合)
211
+ */
212
+ static fetchError(target, url, error, status, startedAt) {
213
+ HaoriEvent.dispatch(target, 'fetcherror', {
214
+ url,
215
+ status,
216
+ error,
217
+ durationMs: startedAt ? performance.now() - startedAt : undefined,
218
+ });
219
+ }
220
+ }
221
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @fileoverview イベント振り分け機能
3
+ *
4
+ * クリック/変更/ロードイベントを検出し Procedure に委譲します。
5
+ */
6
+ /**
7
+ * イベントの振り分けを行うクラスです。
8
+ */
9
+ export default class EventDispatcher {
10
+ /** ルート要素 */
11
+ private readonly root;
12
+ /** クリックデリゲータ */
13
+ private readonly onClick;
14
+ /** 変更デリゲータ */
15
+ private readonly onChange;
16
+ /** ロードデリゲータ(キャプチャで拾う) */
17
+ private readonly onLoadCapture;
18
+ /** ページ全体のロード完了時の処理 */
19
+ private readonly onWindowLoad;
20
+ /**
21
+ * コンストラクタ。
22
+ *
23
+ * @param root 監視対象のルート要素(デフォルトは document )
24
+ */
25
+ constructor(root?: Document | HTMLElement);
26
+ /**
27
+ * イベントリスナーの登録を開始します。
28
+ * クリック、変更、ロードイベントを監視し、対応するProcedureを実行します。
29
+ */
30
+ start(): void;
31
+ /**
32
+ * イベントリスナーの登録を停止します。
33
+ */
34
+ stop(): void;
35
+ /**
36
+ * イベントを処理し、対応するProcedureを実行します。
37
+ *
38
+ * @param event 発生したイベント
39
+ * @param type イベントタイプ('click', 'change', 'load'など)
40
+ */
41
+ private delegate;
42
+ /**
43
+ * イベントのターゲットから HTMLElement を取得します。
44
+ *
45
+ * @param target イベントのターゲット
46
+ * @returns HTMLElement または null
47
+ */
48
+ private getElementFromTarget;
49
+ }
50
+ //# sourceMappingURL=event_dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event_dispatcher.d.ts","sourceRoot":"","sources":["../../src/event_dispatcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,YAAY;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyB;IAE9C,gBAAgB;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmD;IAE3E,cAAc;IACd,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoD;IAE7E,yBAAyB;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CACC;IAE/B,sBAAsB;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAO3B;IAEF;;;;OAIG;gBACS,IAAI,GAAE,QAAQ,GAAG,WAAsB;IAInD;;;OAGG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAoBhB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;CAY7B"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * @fileoverview イベント振り分け機能
3
+ *
4
+ * クリック/変更/ロードイベントを検出し Procedure に委譲します。
5
+ */
6
+ import Fragment, { ElementFragment } from './fragment';
7
+ import Procedure from './procedure';
8
+ import Log from './log';
9
+ /**
10
+ * イベントの振り分けを行うクラスです。
11
+ */
12
+ export default class EventDispatcher {
13
+ /**
14
+ * コンストラクタ。
15
+ *
16
+ * @param root 監視対象のルート要素(デフォルトは document )
17
+ */
18
+ constructor(root = document) {
19
+ /** クリックデリゲータ */
20
+ this.onClick = (event) => this.delegate(event, 'click');
21
+ /** 変更デリゲータ */
22
+ this.onChange = (event) => this.delegate(event, 'change');
23
+ /** ロードデリゲータ(キャプチャで拾う) */
24
+ this.onLoadCapture = (event) => this.delegate(event, 'load');
25
+ /** ページ全体のロード完了時の処理 */
26
+ this.onWindowLoad = () => {
27
+ // ページロード時にも load を1回ディスパッチ
28
+ const html = document.documentElement;
29
+ const fragment = Fragment.get(html);
30
+ if (fragment) {
31
+ void new Procedure(fragment, 'load').run();
32
+ }
33
+ };
34
+ this.root = root;
35
+ }
36
+ /**
37
+ * イベントリスナーの登録を開始します。
38
+ * クリック、変更、ロードイベントを監視し、対応するProcedureを実行します。
39
+ */
40
+ start() {
41
+ this.root.addEventListener('click', this.onClick);
42
+ this.root.addEventListener('change', this.onChange);
43
+ // load は非バブルなのでキャプチャで拾う
44
+ this.root.addEventListener('load', this.onLoadCapture, true);
45
+ // ページ全体のロード
46
+ window.addEventListener('load', this.onWindowLoad, { once: true });
47
+ }
48
+ /**
49
+ * イベントリスナーの登録を停止します。
50
+ */
51
+ stop() {
52
+ this.root.removeEventListener('click', this.onClick);
53
+ this.root.removeEventListener('change', this.onChange);
54
+ this.root.removeEventListener('load', this.onLoadCapture, true);
55
+ window.removeEventListener('load', this.onWindowLoad);
56
+ }
57
+ /**
58
+ * イベントを処理し、対応するProcedureを実行します。
59
+ *
60
+ * @param event 発生したイベント
61
+ * @param type イベントタイプ('click', 'change', 'load'など)
62
+ */
63
+ delegate(event, type) {
64
+ const element = this.getElementFromTarget(event.target);
65
+ if (!element) {
66
+ return;
67
+ }
68
+ const fragment = Fragment.get(element);
69
+ if (!fragment) {
70
+ return;
71
+ }
72
+ // changeイベントの場合、DOM値と同期
73
+ if (type === 'change' && fragment instanceof ElementFragment) {
74
+ fragment.syncValue();
75
+ }
76
+ new Procedure(fragment, type).run().catch(error => {
77
+ Log.error('[Haori]', 'Procedure execution error:', error);
78
+ });
79
+ }
80
+ /**
81
+ * イベントのターゲットから HTMLElement を取得します。
82
+ *
83
+ * @param target イベントのターゲット
84
+ * @returns HTMLElement または null
85
+ */
86
+ getElementFromTarget(target) {
87
+ if (!target) {
88
+ return null;
89
+ }
90
+ if (target instanceof HTMLElement) {
91
+ return target;
92
+ }
93
+ if (target instanceof Node) {
94
+ return target.parentElement;
95
+ }
96
+ return null;
97
+ }
98
+ }
99
+ //# sourceMappingURL=event_dispatcher.js.map