haori 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/haori.cjs.js +10 -10
- package/dist/haori.cjs.js.map +1 -1
- package/dist/haori.es.js +382 -358
- package/dist/haori.es.js.map +1 -1
- package/dist/haori.iife.js +10 -10
- package/dist/haori.iife.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/src/procedure.d.ts +2 -0
- package/dist/src/procedure.d.ts.map +1 -1
- package/dist/src/procedure.js +37 -2
- package/dist/src/procedure.js.map +1 -1
- package/dist/tests/procedure-action-operations.test.js +128 -0
- package/dist/tests/procedure-action-operations.test.js.map +1 -1
- package/package.json +1 -1
package/dist/haori.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"haori.es.js","sources":["../src/dev.ts","../src/env.ts","../src/log.ts","../src/expression.ts","../src/queue.ts","../src/haori.ts","../src/form.ts","../src/fragment.ts","../src/event.ts","../src/procedure.ts","../src/url.ts","../src/import.ts","../src/core.ts","../src/event_dispatcher.ts","../src/intersect.ts","../src/observer.ts","../src/index.ts"],"sourcesContent":["/**\n * @fileoverview Haori開発モード管理機能\n *\n * 開発モードの有効/無効を管理し、デバッグ機能の制御を行います。\n * プロダクション環境では開発向け機能を無効化することで、\n * パフォーマンスとセキュリティを向上させます。\n */\n\n/**\n * 開発モード管理クラスです。\n */\nexport default class Dev {\n /** 開発モードフラグ */\n private static devMode = false;\n\n /**\n * 開発モードの状態を取得します。\n *\n * @returns 開発モードならtrue、そうでなければfalse\n */\n static isEnabled(): boolean {\n return Dev.devMode;\n }\n\n /**\n * 開発モードを有効化します。\n */\n static enable(): void {\n Dev.devMode = true;\n }\n\n /**\n * 開発モードを無効化します。\n */\n static disable(): void {\n Dev.devMode = false;\n }\n\n /**\n * 開発モードを切り替えます。\n *\n * @param enabled trueで有効化、falseで無効化\n */\n static set(enabled: boolean): void {\n Dev.devMode = enabled;\n }\n}\n","/**\n * @fileoverview Haori環境検出機能\n *\n * 実行環境を管理します。\n */\n\nimport Dev from './dev';\n\n/**\n * Haori.js の実行モードを表します。\n */\nexport type HaoriRuntime = 'embedded' | 'demo';\n\nconst DEFAULT_RUNTIME: HaoriRuntime = 'embedded';\n\n/**\n * 指定文字列が有効な実行モードかどうかを判定します。\n *\n * @param runtime 判定対象の文字列。\n * @return 有効な実行モードなら true。\n */\nfunction isHaoriRuntime(runtime: string): runtime is HaoriRuntime {\n return runtime === 'embedded' || runtime === 'demo';\n}\n\n/**\n * data-runtime 属性値を実行モードへ正規化します。\n *\n * @param runtime 属性から取得した値。\n * @return 有効な実行モード。属性が未設定なら null、無効値なら embedded。\n */\nfunction resolveRuntimeAttribute(runtime: string | null): HaoriRuntime | null {\n if (runtime === null) {\n return null;\n }\n\n return isHaoriRuntime(runtime) ? runtime : DEFAULT_RUNTIME;\n}\n\n/**\n * 実行環境を管理するクラスです。\n */\nexport default class Env {\n private static _prefix: string = 'data-';\n private static _runtime: HaoriRuntime = DEFAULT_RUNTIME;\n\n /**\n * 実行モードを取得します。\n *\n * @returns 実行モード。\n */\n public static get runtime(): HaoriRuntime {\n return Env._runtime;\n }\n\n /**\n * 実行モードを設定します。\n *\n * @param runtime 設定する実行モード。\n * @return 戻り値はありません。\n */\n public static setRuntime(runtime: string): void {\n Env._runtime = isHaoriRuntime(runtime) ? runtime : DEFAULT_RUNTIME;\n }\n\n /**\n * 実行環境からプレフィックスと開発モードかどうかを自動検出します。\n * scriptタグにdata-prefixがある場合は、その値+\"-\"をプレフィックスとして使用します。\n * scriptタグにdata-dev属性がある場合、\n * もしくはローカルホスト系ドメインであれば開発モードを有効化します。\n */\n static detect(): void {\n try {\n const currentScript =\n document.currentScript ||\n document.querySelector('script[src*=\"haori\"]');\n if (currentScript instanceof HTMLScriptElement) {\n const prefix = currentScript.getAttribute('data-prefix') || Env._prefix;\n Env._prefix = prefix.endsWith('-') ? prefix : prefix + '-';\n\n const runtime = resolveRuntimeAttribute(\n currentScript.getAttribute('data-runtime'),\n );\n if (runtime !== null) {\n Env._runtime = runtime;\n }\n }\n if (\n currentScript instanceof HTMLScriptElement &&\n currentScript.hasAttribute(`${Env._prefix}dev`)\n ) {\n Dev.set(true);\n return;\n }\n\n // ローカルホスト系ドメインの場合\n const host = window.location.hostname;\n if (\n host === 'localhost' ||\n host.endsWith('.localhost') ||\n host === '127.0.0.1' ||\n host === '::1' ||\n host.endsWith('.local')\n ) {\n Dev.set(true);\n return;\n }\n\n // それ以外は開発モードを無効化\n Dev.set(false);\n } catch {\n // SSRや非ブラウザ環境では無視\n }\n }\n\n /**\n * プレフィックスを取得します。\n *\n * @returns プレフィックス\n */\n public static get prefix(): string {\n return Env._prefix;\n }\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', Env.detect);\n} else {\n Env.detect();\n}\n","/**\n * @fileoverview Haori共通ログ機能\n *\n * 開発モード時のみログ出力を行います。\n */\n\nimport Dev from './dev';\n\n/**\n * ログ出力を管理するクラス\n */\nexport default class Log {\n /**\n * 開発モードでのみコンソールに情報を出力します。\n *\n * @param message 出力するメッセージ\n * @param args 追加の引数\n */\n static info(message: string, ...args: unknown[]): void {\n if (Dev.isEnabled() && console.log) {\n console.log(message, ...args);\n }\n }\n\n /**\n * 開発モードでのみコンソールに警告を出力します。\n *\n * @param message 出力するメッセージ\n * @param args 追加の引数\n */\n static warn(message: string, ...args: unknown[]): void {\n if (Dev.isEnabled() && console.warn) {\n console.warn(message, ...args);\n }\n }\n\n /**\n * モードに関係なくコンソールにエラーを出力します。\n *\n * @param message 出力するメッセージ\n * @param args 追加の引数\n */\n static error(message: string, ...args: unknown[]): void {\n console.error(message, ...args);\n }\n}\n","/**\n * @fileoverview 式評価エンジン\n *\n * 式評価システムです。\n * XSS攻撃やコードインジェクションを防ぐためのセキュリティ機能と、\n * パフォーマンス向上のためのキャッシュ機能を提供します。\n */\n\nimport Log from './log';\n\n/**\n * 式評価結果の詳細です。\n */\nexport interface ExpressionEvaluationDetail {\n /** 評価結果 */\n value: unknown;\n\n /** 未解決参照が含まれていたかどうか */\n unresolvedReference: boolean;\n}\n\ntype ExpressionTokenType = 'identifier' | 'number' | 'string' | 'operator';\n\ninterface ExpressionToken {\n type: ExpressionTokenType;\n value: string;\n position: number;\n}\n\ninterface ExpressionEvaluatorSetup {\n bindKeys: string[];\n evaluator: ((...args: unknown[]) => unknown) | null;\n compileFailed: boolean;\n}\n\ntype GroupContext = 'paren' | 'array' | 'member' | 'object';\n\nexport default class Expression {\n /** 未宣言識別子の自動補完を試みる最大回数 */\n private static readonly MAX_IDENTIFIER_RECOVERY_COUNT = 8;\n\n /** 危険値チェック結果の短命キャッシュ */\n private static forbiddenBindingValueCache = new WeakMap<object, boolean>();\n\n /** 危険値チェックキャッシュのクリア予約済みフラグ */\n private static forbiddenBindingValueCacheResetScheduled = false;\n\n /** Haoriで禁止すべき識別子一覧(eval と arguments は strict モードで無効化) */\n private static readonly FORBIDDEN_NAMES = [\n // グローバルオブジェクト\n 'window',\n 'self',\n 'globalThis',\n 'frames',\n 'parent',\n 'top',\n // 危険な関数/オブジェクト\n 'Function',\n 'setTimeout',\n 'setInterval',\n 'requestAnimationFrame',\n 'alert',\n 'confirm',\n 'prompt',\n 'fetch',\n 'XMLHttpRequest',\n 'Reflect',\n // 脱出経路・プロトタイプ\n 'constructor',\n '__proto__',\n 'prototype',\n 'Object',\n // その他\n 'document',\n 'location',\n 'navigator',\n 'localStorage',\n 'sessionStorage',\n 'IndexedDB',\n 'history',\n ];\n\n /** strict モードで禁止される識別子 */\n private static readonly STRICT_FORBIDDEN_NAMES = ['eval', 'arguments'];\n\n /** 明示バインド時のみ利用を許可する衝突名 */\n private static readonly REBINDABLE_FORBIDDEN_NAMES = new Set(['location']);\n\n /** バインド識別子としては拒否する名前 */\n private static readonly FORBIDDEN_BINDING_NAMES = new Set([\n ...Expression.FORBIDDEN_NAMES.filter(\n name => !Expression.REBINDABLE_FORBIDDEN_NAMES.has(name),\n ),\n 'constructor',\n '__proto__',\n 'prototype',\n ...Expression.STRICT_FORBIDDEN_NAMES,\n ]);\n\n /**\n * 明示バインド内に持ち込まれてはならない危険値を返します。\n *\n * @returns 危険値の配列\n */\n private static getForbiddenBindingValues(): unknown[] {\n const scope = globalThis as typeof globalThis & {\n window?: Window;\n document?: Document;\n navigator?: Navigator;\n history?: History;\n localStorage?: Storage;\n sessionStorage?: Storage;\n fetch?: typeof fetch;\n };\n const candidates: unknown[] = [\n scope,\n scope.window,\n scope.document,\n scope.navigator,\n scope.history,\n scope.localStorage,\n scope.sessionStorage,\n scope.fetch,\n scope.Function,\n scope.setTimeout,\n scope.setInterval,\n scope.requestAnimationFrame,\n scope.alert,\n scope.confirm,\n scope.prompt,\n ];\n if (scope.window?.location) {\n candidates.push(scope.window.location);\n }\n return candidates.filter(value => value !== undefined && value !== null);\n }\n\n /**\n * 現在の評価サイクルで利用する危険値集合を返します。\n *\n * @returns 危険値の集合\n */\n private static getForbiddenBindingValueSet(): ReadonlySet<unknown> {\n return new Set(this.getForbiddenBindingValues());\n }\n\n /**\n * 危険値チェック用の短命キャッシュを次の microtask で破棄します。\n */\n private static scheduleForbiddenBindingValueCacheReset(): void {\n if (this.forbiddenBindingValueCacheResetScheduled) {\n return;\n }\n this.forbiddenBindingValueCacheResetScheduled = true;\n queueMicrotask(() => {\n this.forbiddenBindingValueCache = new WeakMap<object, boolean>();\n this.forbiddenBindingValueCacheResetScheduled = false;\n });\n }\n\n /** プロパティアクセスで拒否する名前 */\n private static readonly FORBIDDEN_PROPERTY_NAMES = new Set([\n 'constructor',\n '__proto__',\n 'prototype',\n ]);\n\n /** object literal のプロパティ定義で前置修飾子として扱う識別子 */\n private static readonly OBJECT_PROPERTY_MODIFIERS = new Set([\n 'get',\n 'set',\n 'async',\n ]);\n\n /** 式構文として許可しない予約語 */\n private static readonly DISALLOWED_KEYWORDS = new Set([\n 'await',\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'let',\n 'new',\n 'return',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n ]);\n\n /** 式 → 評価関数のグローバルキャッシュ */\n private static readonly EXPRESSION_CACHE = new Map<\n string,\n (...args: unknown[]) => unknown\n >();\n\n /**\n * 現在のバインド識別子に含まれない禁止グローバルを遮断するコードを生成します。\n *\n * @param bindKeys 現在の式で利用するバインド識別子一覧\n * @returns 評価前に挿入する初期化コード\n */\n private static buildAssignments(bindKeys: string[]): string {\n const bindKeySet = new Set(bindKeys);\n return this.FORBIDDEN_NAMES.filter(name => !bindKeySet.has(name))\n .map(name => `const ${name} = undefined`)\n .join(';\\n');\n }\n\n /**\n * 式を評価します。\n *\n * @param expression 評価する式文字列\n * @param bindedValue バインドされた値のオブジェクト\n */\n public static evaluate(\n expression: string,\n bindedValues: Record<string, unknown> = {},\n ): unknown {\n return this.evaluateDetailed(expression, bindedValues).value;\n }\n\n /**\n * 式を評価し、未解決参照の有無を含む詳細結果を返します。\n *\n * @param expression 評価する式文字列\n * @param bindedValues バインドされた値のオブジェクト\n * @returns 評価結果と未解決参照の有無\n */\n public static evaluateDetailed(\n expression: string,\n bindedValues: Record<string, unknown> = {},\n ): ExpressionEvaluationDetail {\n this.scheduleForbiddenBindingValueCacheReset();\n if (expression.trim() === '') {\n Log.warn('[Haori]', expression, 'Expression is empty');\n return {value: null, unresolvedReference: false};\n }\n if (this.containsDangerousPatterns(expression)) {\n Log.warn('[Haori]', expression, 'Expression contains dangerous patterns');\n return {value: null, unresolvedReference: false};\n }\n if (this.containsForbiddenKeys(bindedValues)) {\n Log.warn('[Haori]', bindedValues, 'Binded values contain forbidden keys');\n return {value: null, unresolvedReference: false};\n }\n const forbiddenBindingValues = this.getForbiddenBindingValueSet();\n if (\n this.containsForbiddenBindingValues(\n bindedValues,\n new WeakSet(),\n forbiddenBindingValues,\n )\n ) {\n Log.warn(\n '[Haori]',\n bindedValues,\n 'Binded values contain forbidden values',\n );\n return {value: null, unresolvedReference: false};\n }\n\n const runtimeBindings = {...bindedValues};\n const allowMissingIdentifierRecovery =\n this.canAttemptMissingIdentifierRecovery(expression);\n\n for (\n let recoveryCount = 0;\n recoveryCount <= this.MAX_IDENTIFIER_RECOVERY_COUNT;\n recoveryCount += 1\n ) {\n const setup = this.prepareEvaluator(expression, runtimeBindings);\n if (setup.compileFailed || setup.evaluator === null) {\n return {value: null, unresolvedReference: false};\n }\n try {\n const argValues: unknown[] = [];\n const wrappedValues = this.wrapBoundValues(runtimeBindings);\n setup.bindKeys.forEach((key: string) => {\n argValues.push(wrappedValues[key]);\n });\n return {\n value: this.withBlockedPropertyAccess(() =>\n setup.evaluator!(...argValues),\n ),\n unresolvedReference: false,\n };\n } catch (error) {\n if (allowMissingIdentifierRecovery && error instanceof ReferenceError) {\n const missingIdentifier = this.extractMissingIdentifier(error);\n if (\n missingIdentifier !== null &&\n this.canRecoverMissingIdentifier(missingIdentifier, runtimeBindings)\n ) {\n runtimeBindings[missingIdentifier] = undefined;\n continue;\n }\n }\n Log.error('[Haori]', 'Expression evaluation error:', expression, error);\n if (error instanceof ReferenceError) {\n // ReferenceError(未定義変数)はundefinedを返す\n return {value: undefined, unresolvedReference: true};\n }\n return {value: null, unresolvedReference: false};\n }\n }\n\n Log.error(\n '[Haori]',\n 'Failed to recover missing identifiers:',\n expression,\n runtimeBindings,\n );\n return {value: undefined, unresolvedReference: true};\n }\n\n /**\n * 現在のバインド集合で evaluator を取得または生成します。\n *\n * @param expression 評価する式\n * @param bindedValues バインドされた値のオブジェクト\n * @returns evaluator 準備結果\n */\n private static prepareEvaluator(\n expression: string,\n bindedValues: Record<string, unknown>,\n ): ExpressionEvaluatorSetup {\n const bindKeys = Object.keys(bindedValues)\n .filter(key => !this.FORBIDDEN_BINDING_NAMES.has(key))\n .sort();\n const cacheKey = `${expression}:${bindKeys.join(',')}`;\n\n let evaluator = this.EXPRESSION_CACHE.get(cacheKey) || null;\n if (evaluator !== null) {\n return {\n bindKeys,\n evaluator,\n compileFailed: false,\n };\n }\n\n const assignments = this.buildAssignments(bindKeys);\n const body = assignments\n ? '\"use strict\";\\n' + `${assignments};\\nreturn (${expression});`\n : '\"use strict\";\\n' + `return (${expression});`;\n try {\n evaluator = new Function(...bindKeys, body) as (\n ...args: unknown[]\n ) => unknown;\n this.EXPRESSION_CACHE.set(cacheKey, evaluator);\n return {\n bindKeys,\n evaluator,\n compileFailed: false,\n };\n } catch (error) {\n Log.error(\n '[Haori]',\n 'Failed to compile expression:',\n expression,\n error,\n );\n return {\n bindKeys,\n evaluator: null,\n compileFailed: true,\n };\n }\n }\n\n /**\n * ReferenceError から未宣言識別子名を抽出します。\n *\n * @param error 発生した ReferenceError\n * @returns 識別子名。抽出できない場合は null\n */\n private static extractMissingIdentifier(\n error: ReferenceError,\n ): string | null {\n const message = String(error.message || '');\n const match = message.match(\n /^([A-Za-z_$][A-Za-z0-9_$]*) is not defined$/,\n );\n return match?.[1] || null;\n }\n\n /**\n * 未宣言識別子を undefined バインドとして補完可能かを返します。\n *\n * @param identifier 識別子名\n * @param bindedValues 現在のバインド値\n * @returns 補完可能なら true\n */\n private static canRecoverMissingIdentifier(\n identifier: string,\n bindedValues: Record<string, unknown>,\n ): boolean {\n if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(identifier)) {\n return false;\n }\n return (\n bindedValues[identifier] === undefined &&\n !(identifier in bindedValues)\n );\n }\n\n /**\n * 未宣言識別子の補完を試みてよい式かを返します。\n *\n * @param expression 評価する式\n * @returns 補完を試みてよい場合は true\n */\n private static canAttemptMissingIdentifierRecovery(\n expression: string,\n ): boolean {\n return (\n expression.includes('?.') ||\n expression.includes('??') ||\n expression.includes('||') ||\n expression.includes('&&')\n );\n }\n\n /**\n * 式にevalや危険な構文が含まれているかチェックします。\n *\n * @param expression チェック対象の式文字列\n * @return 危険なパターンが含まれている場合はtrue\n */\n protected static containsDangerousPatterns(expression: string): boolean {\n if (!this.hasAllowedSyntax(expression)) {\n return true;\n }\n const dangerousPatterns = [\n /\\beval\\s*\\(/, // eval(...)\n /\\barguments\\s*\\[/, // arguments[...]\n /\\barguments\\s*\\./, // arguments.xxx\n ];\n return dangerousPatterns.some(pattern => pattern.test(expression));\n }\n\n /**\n * 許可する式構文かどうかを検証します。\n *\n * @param expression 検証対象の式\n * @returns 許可する構文であればtrue\n */\n private static hasAllowedSyntax(expression: string): boolean {\n const tokens = this.tokenizeExpression(expression);\n if (tokens === null || tokens.length === 0) {\n return false;\n }\n\n const groups: GroupContext[] = [];\n let previous: ExpressionToken | null = null;\n\n for (let index = 0; index < tokens.length; index++) {\n const token = tokens[index];\n const next = tokens[index + 1] || null;\n\n const activeGroup = groups[groups.length - 1] || null;\n const beforePrevious = tokens[index - 2] || null;\n const thirdPrevious = tokens[index - 3] || null;\n\n if (\n this.startsObjectKey(\n activeGroup,\n previous,\n beforePrevious,\n thirdPrevious,\n )\n ) {\n if (token.value === '[') {\n return false;\n }\n if (\n token.type === 'identifier' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(token.value)\n ) {\n return false;\n }\n if (\n token.type === 'string' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(\n this.decodeStringLiteral(token.value),\n )\n ) {\n return false;\n }\n }\n\n if (token.type === 'identifier') {\n if (this.DISALLOWED_KEYWORDS.has(token.value)) {\n return false;\n }\n if (this.STRICT_FORBIDDEN_NAMES.includes(token.value)) {\n return false;\n }\n if (\n (previous?.value === '.' || previous?.value === '?.') &&\n this.FORBIDDEN_PROPERTY_NAMES.has(token.value)\n ) {\n return false;\n }\n }\n\n if (activeGroup === 'member' && token.value !== ']') {\n if (\n token.type === 'string' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(\n this.decodeStringLiteral(token.value),\n )\n ) {\n return false;\n }\n }\n\n if (token.value === '.' && next?.type !== 'identifier') {\n return false;\n }\n\n if (\n token.value === '?.' &&\n next?.type !== 'identifier' &&\n next?.value !== '[' &&\n next?.value !== '('\n ) {\n return false;\n }\n\n switch (token.value) {\n case '(':\n groups.push('paren');\n break;\n case ')': {\n const group = groups.pop();\n if (group !== 'paren') {\n return false;\n }\n break;\n }\n case '[': {\n const group: GroupContext = this.startsMemberAccess(previous)\n ? 'member'\n : 'array';\n groups.push(group);\n break;\n }\n case '{':\n groups.push('object');\n break;\n case ']': {\n const group = groups.pop();\n if (group === undefined) {\n return false;\n }\n break;\n }\n case '}': {\n const group = groups.pop();\n if (group !== 'object') {\n return false;\n }\n break;\n }\n }\n\n previous = token;\n }\n\n return groups.length === 0;\n }\n\n /**\n * 式をトークン列に分解します。\n *\n * @param expression 評価前に検証する式\n * @returns 分解結果。未対応構文を含む場合はnull\n */\n private static tokenizeExpression(\n expression: string,\n ): ExpressionToken[] | null {\n const tokens: ExpressionToken[] = [];\n const operators = [\n '===',\n '!==',\n '...',\n '?.',\n '&&',\n '||',\n '>=',\n '<=',\n '==',\n '!=',\n '=>',\n ];\n const singleCharacters = new Set([\n '(',\n ')',\n '{',\n '}',\n '[',\n ']',\n '.',\n ',',\n '?',\n ':',\n '+',\n '-',\n '*',\n '/',\n '%',\n '!',\n '>',\n '<',\n ]);\n let index = 0;\n\n while (index < expression.length) {\n const current = expression[index];\n\n if (/\\s/.test(current)) {\n index += 1;\n continue;\n }\n\n if (\n current === '/' &&\n (expression[index + 1] === '/' || expression[index + 1] === '*')\n ) {\n return null;\n }\n\n if (current === '\"' || current === '\\'') {\n const stringToken = this.readStringToken(expression, index);\n if (stringToken === null) {\n return null;\n }\n tokens.push(stringToken.token);\n index = stringToken.nextIndex;\n continue;\n }\n\n const operator = operators.find(item =>\n expression.startsWith(item, index),\n );\n if (operator) {\n tokens.push({type: 'operator', value: operator, position: index});\n index += operator.length;\n continue;\n }\n\n if (/[0-9]/.test(current)) {\n const numberToken = this.readNumberToken(expression, index);\n tokens.push(numberToken.token);\n index = numberToken.nextIndex;\n continue;\n }\n\n if (/[A-Za-z_$]/.test(current)) {\n const identifierToken = this.readIdentifierToken(expression, index);\n tokens.push(identifierToken.token);\n index = identifierToken.nextIndex;\n continue;\n }\n\n if (singleCharacters.has(current)) {\n tokens.push({type: 'operator', value: current, position: index});\n index += 1;\n continue;\n }\n\n return null;\n }\n\n return tokens;\n }\n\n /**\n * 文字列リテラルを読み取ります。\n *\n * @param expression 式全体\n * @param start 開始位置\n * @returns トークンと次の位置\n */\n private static readStringToken(\n expression: string,\n start: number,\n ): {token: ExpressionToken; nextIndex: number} | null {\n const quote = expression[start];\n let index = start + 1;\n\n while (index < expression.length) {\n const current = expression[index];\n if (current === '\\\\') {\n index += 2;\n continue;\n }\n if (current === quote) {\n return {\n token: {\n type: 'string',\n value: expression.slice(start, index + 1),\n position: start,\n },\n nextIndex: index + 1,\n };\n }\n index += 1;\n }\n\n return null;\n }\n\n /**\n * 数値リテラルを読み取ります。\n *\n * @param expression 式全体\n * @param start 開始位置\n * @returns トークンと次の位置\n */\n private static readNumberToken(\n expression: string,\n start: number,\n ): {token: ExpressionToken; nextIndex: number} {\n let index = start;\n while (index < expression.length && /[0-9_]/.test(expression[index])) {\n index += 1;\n }\n if (expression[index] === '.') {\n index += 1;\n while (index < expression.length && /[0-9_]/.test(expression[index])) {\n index += 1;\n }\n }\n return {\n token: {\n type: 'number',\n value: expression.slice(start, index),\n position: start,\n },\n nextIndex: index,\n };\n }\n\n /**\n * 識別子を読み取ります。\n *\n * @param expression 式全体\n * @param start 開始位置\n * @returns トークンと次の位置\n */\n private static readIdentifierToken(\n expression: string,\n start: number,\n ): {token: ExpressionToken; nextIndex: number} {\n let index = start;\n while (\n index < expression.length &&\n /[A-Za-z0-9_$]/.test(expression[index])\n ) {\n index += 1;\n }\n return {\n token: {\n type: 'identifier',\n value: expression.slice(start, index),\n position: start,\n },\n nextIndex: index,\n };\n }\n\n /**\n * 角括弧がメンバーアクセスかどうかを判定します。\n *\n * @param previous 直前のトークン\n * @returns メンバーアクセスであればtrue\n */\n private static startsMemberAccess(previous: ExpressionToken | null): boolean {\n if (previous === null) {\n return false;\n }\n if (previous.type === 'identifier' || previous.type === 'number') {\n return true;\n }\n return (\n previous.value === ')' ||\n previous.value === ']' ||\n previous.value === '?.'\n );\n }\n\n /**\n * object literal 内で次のトークンがキー位置かどうかを判定します。\n *\n * @param activeGroup 現在のグループ種別\n * @param previous 直前のトークン\n * @returns object literal のキー位置であれば true\n */\n private static startsObjectKey(\n activeGroup: GroupContext | null,\n previous: ExpressionToken | null,\n beforePrevious: ExpressionToken | null,\n thirdPrevious: ExpressionToken | null,\n ): boolean {\n if (activeGroup !== 'object') {\n return false;\n }\n if (previous?.value === '{' || previous?.value === ',') {\n return true;\n }\n\n if (\n previous?.type === 'identifier' &&\n this.OBJECT_PROPERTY_MODIFIERS.has(previous.value) &&\n (beforePrevious?.value === '{' || beforePrevious?.value === ',')\n ) {\n return true;\n }\n\n if (previous?.value !== '*') {\n return false;\n }\n\n if (beforePrevious?.value === '{' || beforePrevious?.value === ',') {\n return true;\n }\n\n return (\n beforePrevious?.type === 'identifier' &&\n beforePrevious.value === 'async' &&\n (thirdPrevious?.value === '{' || thirdPrevious?.value === ',')\n );\n }\n\n /**\n * 文字列リテラルをプレーン文字列へ変換します。\n *\n * @param literal 文字列リテラル\n * @returns デコード後の文字列\n */\n private static decodeStringLiteral(literal: string): string {\n return literal\n .slice(1, -1)\n .replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, (_, code: string) =>\n String.fromCodePoint(parseInt(code, 16)),\n )\n .replace(/\\\\u([0-9a-fA-F]{4})/g, (_, code: string) =>\n String.fromCharCode(parseInt(code, 16)),\n )\n .replace(/\\\\x([0-9a-fA-F]{2})/g, (_, code: string) =>\n String.fromCharCode(parseInt(code, 16)),\n )\n .replace(/\\\\([\"'\\\\bfnrtv0])/g, (_, escaped: string) => {\n switch (escaped) {\n case 'b':\n return '\\b';\n case 'f':\n return '\\f';\n case 'n':\n return '\\n';\n case 'r':\n return '\\r';\n case 't':\n return '\\t';\n case 'v':\n return '\\v';\n case '0':\n return '\\0';\n default:\n return escaped;\n }\n });\n }\n\n /**\n * バインド値を安全なProxyでラップします。\n *\n * @param bindedValues バインド値\n * @returns ラップ済みのバインド値\n */\n private static wrapBoundValues(\n bindedValues: Record<string, unknown>,\n ): Record<string, unknown> {\n const cache = new WeakMap<object, unknown>();\n const wrappedValues: Record<string, unknown> = {};\n\n Object.entries(bindedValues).forEach(([key, value]) => {\n wrappedValues[key] = this.wrapBoundValue(value, cache);\n });\n\n return wrappedValues;\n }\n\n /**\n * 危険なプロパティアクセスを防ぐために値を再帰的にラップします。\n *\n * @param value ラップ対象の値\n * @param cache 既存Proxyのキャッシュ\n * @returns ラップ済みの値\n */\n private static wrapBoundValue(\n value: unknown,\n cache: WeakMap<object, unknown>,\n ): unknown {\n if (!this.shouldWrapValue(value)) {\n return value;\n }\n\n const target = value as object;\n const cachedValue = cache.get(target);\n if (cachedValue !== undefined) {\n return cachedValue;\n }\n\n const proxy = new Proxy(target, {\n get: (currentTarget, property, receiver) => {\n if (\n typeof property === 'string' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(property)\n ) {\n return undefined;\n }\n const result = Reflect.get(currentTarget, property, receiver);\n if (typeof property === 'symbol') {\n return result;\n }\n return this.wrapBoundValue(result, cache);\n },\n has: (currentTarget, property) => {\n if (\n typeof property === 'string' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(property)\n ) {\n return false;\n }\n return Reflect.has(currentTarget, property);\n },\n getOwnPropertyDescriptor: (currentTarget, property) => {\n if (\n typeof property === 'string' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(property)\n ) {\n return undefined;\n }\n return Reflect.getOwnPropertyDescriptor(currentTarget, property);\n },\n apply: (currentTarget, thisArg, argArray) => {\n const result = Reflect.apply(\n currentTarget as (...args: unknown[]) => unknown,\n thisArg,\n argArray,\n );\n if (this.isIteratorLike(result)) {\n return result;\n }\n return this.wrapBoundValue(result, cache);\n },\n construct: (currentTarget, argArray, newTarget) => {\n return this.wrapBoundValue(\n Reflect.construct(\n currentTarget as new (...args: unknown[]) => object,\n argArray,\n newTarget,\n ),\n cache,\n ) as object;\n },\n });\n\n cache.set(target, proxy);\n return proxy;\n }\n\n /**\n * Proxy ラップ対象の値かどうかを判定します。\n *\n * @param value 判定対象\n * @returns ラップ対象であればtrue\n */\n private static shouldWrapValue(value: unknown): value is object {\n if (typeof value === 'function') {\n return true;\n }\n if (value === null || typeof value !== 'object') {\n return false;\n }\n if (Array.isArray(value)) {\n return true;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n }\n\n /**\n * 評価中のみ prototype 系プロパティへの生アクセスを抑止します。\n *\n * @param callback 実行する処理\n * @returns 処理結果\n */\n private static withBlockedPropertyAccess<T>(callback: () => T): T {\n const blockedDescriptors = [\n {target: Object.prototype, property: 'constructor'},\n {target: Function.prototype, property: 'constructor'},\n {target: Object.prototype, property: '__proto__'},\n ] as const;\n const originals = blockedDescriptors\n .map(item => ({\n ...item,\n descriptor: Object.getOwnPropertyDescriptor(item.target, item.property),\n }))\n .filter(item => item.descriptor?.configurable === true);\n\n originals.forEach(({target, property}) => {\n Object.defineProperty(target, property, {\n configurable: true,\n enumerable: false,\n get: () => undefined,\n set: () => undefined,\n });\n });\n\n try {\n return callback();\n } finally {\n originals.forEach(({target, property, descriptor}) => {\n if (descriptor !== undefined) {\n Object.defineProperty(target, property, descriptor);\n }\n });\n }\n }\n\n /**\n * イテレータ互換オブジェクトかどうかを判定します。\n *\n * @param value 判定対象\n * @returns イテレータ互換であればtrue\n */\n private static isIteratorLike(value: unknown): boolean {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n\n return typeof (value as Iterator<unknown>).next === 'function';\n }\n\n /**\n * トップレベルのバインド識別子に拒否対象名が含まれていないかを判定します。\n * ネストしたオブジェクトのプロパティ名は識別子として評価されないため、ここでは拒否しません。\n *\n * @param obj チェック対象のオブジェクト\n * @return 禁止識別子が含まれていればtrue\n */\n protected static containsForbiddenKeys(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n for (const key of Object.keys(obj as object)) {\n if (this.FORBIDDEN_BINDING_NAMES.has(key)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * バインド値に危険なホストオブジェクトやグローバル関数が含まれていないかを再帰的に判定します。\n *\n * @param obj チェック対象の値\n * @param seen 循環参照検出用の訪問済み集合\n * @return 危険値が含まれていればtrue\n */\n protected static containsForbiddenBindingValues(\n obj: unknown,\n seen: WeakSet<object> = new WeakSet<object>(),\n forbiddenBindingValues: ReadonlySet<unknown> =\n this.getForbiddenBindingValueSet(),\n ): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n const cached = this.forbiddenBindingValueCache.get(obj as object);\n if (cached !== undefined) {\n return cached;\n }\n\n if (seen.has(obj as object)) {\n return false;\n }\n seen.add(obj as object);\n\n if (forbiddenBindingValues.has(obj)) {\n this.forbiddenBindingValueCache.set(obj as object, true);\n return true;\n }\n\n for (const value of Object.values(obj as Record<string, unknown>)) {\n if (typeof value === 'function') {\n if (forbiddenBindingValues.has(value)) {\n this.forbiddenBindingValueCache.set(obj as object, true);\n return true;\n }\n continue;\n }\n if (\n this.containsForbiddenBindingValues(value, seen, forbiddenBindingValues)\n ) {\n this.forbiddenBindingValueCache.set(obj as object, true);\n return true;\n }\n }\n\n this.forbiddenBindingValueCache.set(obj as object, false);\n return false;\n }\n}\n","/**\n * @fileoverview 汎用非同期キュー機能\n *\n * 任意の処理を非同期でキューイングし、requestAnimationFrameを使用して順次実行します。\n * 各処理はPromiseを返し、完了時の処理を記述できます。\n * DOM操作などの非同期処理に適しています。\n */\n\nimport Log from './log';\n\n/**\n * キューアイテムの基本構造。\n */\ninterface QueueItem {\n /** 実行する処理 */\n task: () => unknown | Promise<unknown>;\n\n /** 作成時刻 */\n timestamp: number;\n\n /** 完了Promise */\n promise: Promise<unknown>;\n\n /** Promise解決用の関数 */\n resolve: (value: unknown | PromiseLike<unknown>) => void;\n\n /** Promise拒否用の関数 */\n reject: (reason?: unknown) => void;\n}\n\n/**\n * 非同期キュークラス。\n * キュー内の処理を管理し、順次実行します。\n */\nclass AsyncQueue {\n private readonly MAX_BUDGET = 8; // 1フレームあたりの最大処理時間(ms)\n\n /** キュー内の処理 */\n private readonly queue: QueueItem[] = [];\n\n /** 処理中フラグ */\n private processing = false;\n\n /**\n * 処理をキューに追加します\n *\n * @param task 実行する処理\n * @param prepend trueの場合はキューの先頭に追加、falseの場合は末尾に追加\n * @returns 処理完了Promise\n */\n public enqueue(\n task: () => unknown,\n prepend: boolean = false,\n ): Promise<unknown> {\n let resolve: (value: unknown | PromiseLike<unknown>) => void;\n let reject: (reason?: unknown) => void;\n const promise = new Promise<unknown>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const item: QueueItem = {\n task,\n timestamp: performance.now(),\n promise,\n resolve: resolve!,\n reject: reject!,\n };\n if (prepend) {\n this.queue.unshift(item);\n } else {\n this.queue.push(item);\n }\n this.scheduleProcessing();\n return promise;\n }\n\n /**\n * キューを処理します。\n *\n * @returns 処理完了Promise\n */\n private async processQueue(): Promise<void> {\n if (this.processing || this.queue.length === 0) {\n return;\n }\n this.processing = true;\n try {\n const start = performance.now();\n while (this.queue.length > 0) {\n const item = this.queue.shift();\n if (!item) {\n return;\n }\n try {\n const result = await item.task();\n item.resolve(result);\n } catch (error) {\n item.reject(error);\n Log.error('[Haori]', `Task ${item.timestamp} failed:`, error);\n }\n if (performance.now() - start > this.MAX_BUDGET) {\n // 1フレームの処理時間を超えたら一旦終了\n break;\n }\n }\n } catch (error) {\n Log.error('[Haori]', 'Error processing queue:', error);\n } finally {\n this.processing = false;\n if (this.queue.length > 0) {\n this.scheduleProcessing();\n }\n }\n }\n\n /**\n * 処理をスケジュールします。\n */\n private scheduleProcessing(): void {\n if (this.processing) {\n return;\n }\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(() => {\n this.processQueue();\n });\n } else {\n setTimeout(() => {\n this.processQueue();\n }, 16); // 60fps\n }\n }\n\n /**\n * キューが空になるまで待機します。\n *\n * @returns キューが空になったら解決されるPromise\n */\n public async wait(): Promise<void> {\n if (this.queue.length === 0 && !this.processing) {\n return;\n }\n const promises = this.queue.map(item => item.promise);\n if (promises.length > 0) {\n await Promise.allSettled(promises);\n }\n }\n}\n\n/**\n * 非同期キューのデフォルトインスタンス。\n * このインスタンスを使用して、アプリケーション全体でタスクをキューイングできます。\n */\nexport default class Queue {\n /** 非同期キューインスタンス */\n private static readonly ASYNC_QUEUE = new AsyncQueue();\n\n /**\n * タスクをキューに追加します。\n *\n * @param task 実行する処理\n * @param prepend trueの場合はキューの先頭に追加、falseの場合は末尾に追加\n * @returns 処理完了Promise\n */\n public static enqueue(\n task: () => unknown,\n prepend: boolean = false,\n ): Promise<unknown> {\n return this.ASYNC_QUEUE.enqueue(task, prepend);\n }\n\n /**\n * 全てのキュー処理が完了するまで待機します。\n */\n public static wait(): Promise<void> {\n return this.ASYNC_QUEUE.wait();\n }\n}\n","import Log from './log';\nimport Env from './env';\nimport Queue from './queue';\n\n/**\n * Haoriクラスは、アプリケーション全体で使用されるユーティリティメソッドを提供します。\n * 挙動を変更する場合は必要に応じてオーバライドしてください。\n */\nexport default class Haori {\n /**\n * 実行モードを取得します。\n *\n * @return 実行モード。\n */\n public static get runtime(): 'embedded' | 'demo' {\n return Env.runtime;\n }\n\n /**\n * 実行モードを設定します。\n *\n * @param runtime 設定する実行モード。\n * @return 戻り値はありません。\n */\n public static setRuntime(runtime: string): void {\n Env.setRuntime(runtime);\n }\n\n /**\n * 通知ダイアログを表示します。\n *\n * @param message 表示メッセージ\n * @returns 通知が閉じられると解決されるPromise\n */\n public static dialog(message: string): Promise<void> {\n return Queue.enqueue(() => {\n window.alert(message);\n }, true) as Promise<void>;\n }\n\n /**\n * 通知トーストを表示します。\n *\n * @param message 表示メッセージ\n * @param level メッセージのレベル(省略時は 'info')\n * @return 通知が表示されると解決されるPromise\n */\n public static async toast(\n message: string,\n level: 'info' | 'warning' | 'error' | 'success' = 'info',\n ): Promise<void> {\n const toast = document.createElement('div');\n toast.className = `haori-toast haori-toast-${level}`;\n toast.textContent = message;\n toast.setAttribute('popover', 'manual');\n toast.setAttribute('role', 'status');\n toast.setAttribute('aria-live', level === 'error' ? 'assertive' : 'polite');\n document.body.appendChild(toast);\n toast.showPopover();\n setTimeout(() => {\n try {\n toast.hidePopover();\n } finally {\n toast.remove();\n }\n }, 3000);\n }\n\n /**\n * 確認ダイアログを表示します。\n *\n * @param message 確認メッセージ\n * @returns ユーザーがOKをクリックした場合はtrue、キャンセルした場合はfalseが解決されるPromise\n */\n public static confirm(message: string): Promise<boolean> {\n return Queue.enqueue(() => {\n return window.confirm(message);\n }, true) as Promise<boolean>;\n }\n\n /**\n * ダイアログを開きます。\n *\n * @param element 開くダイアログのHTML要素\n */\n public static openDialog(element: HTMLElement): Promise<void> {\n return Queue.enqueue(() => {\n if (element instanceof HTMLDialogElement) {\n element.showModal();\n } else {\n Log.error('[Haori]', 'Element is not a dialog: ', element);\n }\n }, true) as Promise<void>;\n }\n\n /**\n * ダイアログを閉じます。\n *\n * @param element 閉じるダイアログのHTML要素\n */\n public static closeDialog(element: HTMLElement): Promise<void> {\n return Queue.enqueue(() => {\n if (element instanceof HTMLDialogElement) {\n element.close();\n } else {\n Log.error('[Haori]', 'Element is not a dialog: ', element);\n }\n }, true) as Promise<void>;\n }\n\n /**\n * エラーメッセージを追加します。\n *\n * @param target メッセージを表示する要素\n * @param message エラーメッセージ\n */\n public static addErrorMessage(\n target: HTMLElement | HTMLFormElement,\n message: string,\n ): Promise<void> {\n return Haori.addMessage(target, message, 'error');\n }\n\n /**\n * メッセージをレベル付きで追加します。\n *\n * @param target メッセージを表示する要素\n * @param message メッセージ\n * @param level メッセージのレベル(省略可能)\n */\n public static addMessage(\n target: HTMLElement | HTMLFormElement,\n message: string,\n level?: 'info' | 'warning' | 'error' | 'success',\n ): Promise<void> {\n return Queue.enqueue(() => {\n // 仕様: 入力要素の場合は親要素に、フォーム要素の場合はフォーム自身に data-message を付与する。\n const recipient =\n target instanceof HTMLFormElement\n ? target\n : (target.parentElement ?? target);\n recipient.setAttribute('data-message', message);\n if (level !== undefined) {\n recipient.setAttribute('data-message-level', level);\n } else {\n recipient.removeAttribute('data-message-level');\n }\n }, true) as Promise<void>;\n }\n\n /**\n * 対象のエレメントおよびその子要素のメッセージをクリアします。\n *\n * @param parent メッセージをクリアする親要素\n */\n public static clearMessages(parent: HTMLElement): Promise<void> {\n return Queue.enqueue(() => {\n parent.removeAttribute('data-message');\n parent.removeAttribute('data-message-level');\n parent.querySelectorAll('[data-message]').forEach(element => {\n element.removeAttribute('data-message');\n element.removeAttribute('data-message-level');\n });\n }, true) as Promise<void>;\n }\n}\n","/**\n * @fileoverview フォーム双方向バインディング\n *\n * フォームと入力要素の双方向バインディングを実現します。\n */\n\nimport Core from './core';\nimport Env from './env';\nimport {ElementFragment} from './fragment';\nimport Haori from './haori';\nimport Log from './log';\nimport Queue from './queue';\n\ntype FormHaoriApi = Pick<typeof Haori, 'addErrorMessage' | 'clearMessages'>;\n\nconst FORM_HAORI_METHOD_NAMES = ['addErrorMessage', 'clearMessages'] as const;\n\n/**\n * Form から利用する Haori API を解決します。\n * window.Haori が差し替えられている場合はそちらを優先します。\n *\n * @returns Form が使用する Haori API。\n */\nfunction resolveFormHaoriApi(): FormHaoriApi {\n const scope = globalThis as typeof globalThis & {\n window?: Window & {Haori?: unknown};\n };\n const candidate = scope.window?.Haori;\n const hasRequiredMethods = FORM_HAORI_METHOD_NAMES.every(\n methodName =>\n typeof (candidate as Record<string, unknown> | undefined)?.[\n methodName\n ] === 'function',\n );\n return hasRequiredMethods ? (candidate as FormHaoriApi) : Haori;\n}\n\n/**\n * Formクラスは、フォームの双方向バインディングを提供します。\n * 入力要素の値をフォームにバインドし、フォームのバインド値を入力要素に反映します。\n */\nexport default class Form {\n /**\n * フォーム内にある入力エレメントの値をオブジェクトとして取得します。\n * data-form-object属性があると、そのエレメント内の値はオブジェクトとして処理されます。\n * 入力エレメントにdata-form-list属性があると、そのエレメントの値はリストとして処理されます。\n * 入力エレメント以外にdata-form-list属性があると、そのエレメントの値はオブジェクトのリストとして処理されます。\n *\n * @param form フォームのElementFragment\n */\n public static getValues(form: ElementFragment): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n return Form.getPartValues(form, values);\n }\n\n /**\n * フォーム内の各入力エレメントから値を取得し、オブジェクトとして返します。\n * 入力エレメントのname属性、data-form-object属性、data-form-list属性に基づいて値を整理します。\n *\n * @param fragment 対象のElementFragment\n * @param values オブジェクトに追加する値のオブジェクト\n * @returns values と同じオブジェクト\n */\n private static getPartValues(\n fragment: ElementFragment,\n values: Record<string, unknown>,\n ): Record<string, unknown> {\n const name = fragment.getAttribute('name');\n const objectName = fragment.getAttribute(`${Env.prefix}form-object`);\n const listName = fragment.getAttribute(`${Env.prefix}form-list`);\n if (name) {\n if (listName) {\n if (Array.isArray(values[String(name)])) {\n (values[String(name)] as unknown[]).push(fragment.getValue());\n } else {\n values[String(name)] = [fragment.getValue()];\n }\n } else {\n values[String(name)] = fragment.getValue();\n }\n if (objectName) {\n Log.warn(\n 'Haori',\n `Element cannot have both ${Env.prefix}form-object` +\n ' and name attributes.',\n );\n }\n for (const child of fragment.getChildElementFragments()) {\n Form.getPartValues(child, values);\n }\n } else if (objectName) {\n const childValues: Record<string, unknown> = {};\n for (const child of fragment.getChildElementFragments()) {\n Form.getPartValues(child, childValues);\n }\n if (Object.keys(childValues).length > 0) {\n values[String(objectName)] = childValues;\n }\n if (listName) {\n Log.warn(\n 'Haori',\n `Element cannot have both ${Env.prefix}form-list` +\n ` and ${Env.prefix}form-object attributes.`,\n );\n }\n } else if (listName) {\n const childList: Record<string, unknown>[] = [];\n for (const child of fragment.getChildElementFragments()) {\n const childValues: Record<string, unknown> = {};\n Form.getPartValues(child, childValues);\n if (Object.keys(childValues).length > 0) {\n childList.push(childValues);\n }\n }\n if (childList.length > 0) {\n values[String(listName)] = childList;\n }\n } else {\n for (const child of fragment.getChildElementFragments()) {\n Form.getPartValues(child, values);\n }\n }\n return values;\n }\n\n /**\n * フォーム内にある入力エレメントに値を設定します。\n * フォームのdata-bind属性に値が反映されます。\n *\n * @param form フォームのElementFragment\n * @param values フォームに設定する値のオブジェクト\n * @param force data-form-detach属性があるエレメントにも値を反映するかどうか\n * @returns Promise(DOMの更新が完了したら解決される)\n */\n public static setValues(\n form: ElementFragment,\n values: Record<string, unknown>,\n force: boolean = false,\n ): Promise<void> {\n return Form.setPartValues(form, values, null, force, true);\n }\n\n /**\n * フォーム内にある入力エレメントに値をイベントなしで設定します。\n * フォーム bindingData からの内部同期に利用します。\n *\n * @param form フォームのElementFragment\n * @param values フォームに設定する値のオブジェクト\n * @param force data-form-detach属性があるエレメントにも値を反映するかどうか\n * @returns Promise(DOMの更新が完了したら解決される)\n */\n public static syncValues(\n form: ElementFragment,\n values: Record<string, unknown>,\n force: boolean = false,\n ): Promise<void> {\n return Form.setPartValues(form, values, null, force, false);\n }\n\n /**\n * 単一フラグメントへ値を設定します。\n *\n * @param fragment 対象フラグメント\n * @param value 設定する値\n * @param emitEvents input/change イベントを発火するかどうか\n * @returns Promise(DOMの更新が完了したら解決される)\n */\n private static applyFragmentValue(\n fragment: ElementFragment,\n value: string | number | boolean | null,\n emitEvents: boolean,\n ): Promise<void> {\n return emitEvents\n ? fragment.setValue(value)\n : fragment.syncBindingValue(value);\n }\n\n /**\n * フラグメント内にある各入力エレメントに値を設定します。\n *\n * @param fragment 対象フラグメント\n * @param values フラグメントに設定する値のオブジェクト\n * @param index 配列の場合のインデックス\n * @param force data-form-detach属性があるエレメントにも値を反映するかどうか\n * @returns Promise(DOMの更新が完了したら解決される)\n */\n private static setPartValues(\n fragment: ElementFragment,\n values: Record<string, unknown>,\n index: number | null = null,\n force: boolean = false,\n emitEvents: boolean = true,\n ): Promise<void> {\n const promises: Promise<void>[] = [];\n const name = fragment.getAttribute('name');\n const objectName = fragment.getAttribute(`${Env.prefix}form-object`);\n const listName = fragment.getAttribute(`${Env.prefix}form-list`);\n const detach = fragment.getAttribute(`${Env.prefix}form-detach`);\n if (name) {\n if (!detach || force) {\n const value = values[String(name)];\n if (listName && Array.isArray(value) && index !== null) {\n promises.push(\n Form.applyFragmentValue(fragment, value[index] ?? null, emitEvents),\n );\n } else if (typeof value === 'undefined') {\n // 未指定のキーは既存の入力値を維持する。\n } else if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n promises.push(Form.applyFragmentValue(fragment, value, emitEvents));\n } else {\n promises.push(\n Form.applyFragmentValue(fragment, String(value), emitEvents),\n );\n }\n }\n } else if (objectName) {\n const childValues = values[String(objectName)];\n if (childValues && typeof childValues === 'object') {\n for (const child of fragment.getChildElementFragments()) {\n promises.push(\n Form.setPartValues(\n child,\n childValues as Record<string, unknown>,\n null,\n force,\n emitEvents,\n ),\n );\n }\n }\n } else if (listName) {\n const childList = values[String(listName)];\n if (Array.isArray(childList)) {\n const children = fragment.getChildElementFragments();\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (childList.length > i) {\n promises.push(\n Form.setPartValues(\n child,\n childList[i] as Record<string, unknown>,\n i,\n force,\n emitEvents,\n ),\n );\n } else {\n promises.push(Form.setPartValues(child, {}, i, force, emitEvents));\n }\n }\n }\n } else {\n for (const child of fragment.getChildElementFragments()) {\n promises.push(\n Form.setPartValues(child, values, null, force, emitEvents),\n );\n }\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * 対象フラグメントとその子孫要素の値を初期化します。\n * 値の初期化とメッセージのクリアを行います。\n *\n * @param fragment 対象フラグメント\n * @returns すべての初期化処理が完了するPromise\n */\n public static async reset(fragment: ElementFragment): Promise<void> {\n // 値をクリア\n Form.clearValues(fragment);\n\n // メッセージをクリアし、data-eachの複製を削除\n await Promise.all([\n Form.clearMessages(fragment),\n Form.clearEachClones(fragment),\n ]);\n\n // フォーム要素をリセット\n await Queue.enqueue(() => {\n const element = fragment.getTarget();\n if (element instanceof HTMLFormElement) {\n element.reset();\n } else {\n const parent = element.parentElement;\n if (parent) {\n const next = element.nextElementSibling;\n const form = document.createElement('form');\n form.appendChild(element);\n form.reset();\n parent.insertBefore(element, next);\n }\n }\n });\n\n // 再評価\n await Core.evaluateAll(fragment);\n }\n\n /**\n * data-each によって生成された複製(テンプレート以外)を削除します。\n * 既存のテンプレートは保持し、その後の再評価で必要に応じて再生成されます。\n * 対象エレメント自体がdata-eachを持つ場合はその子の複製を削除しますが、\n * 対象エレメント自体は削除しません。\n */\n private static clearEachClones(fragment: ElementFragment): Promise<void> {\n const tasks: Promise<void>[] = [];\n\n const removeClones = (f: ElementFragment) => {\n if (f.hasAttribute(`${Env.prefix}each`)) {\n for (const child of f.getChildElementFragments()) {\n const isBefore = child.hasAttribute(`${Env.prefix}each-before`);\n const isAfter = child.hasAttribute(`${Env.prefix}each-after`);\n if (!isBefore && !isAfter) {\n tasks.push(child.remove());\n }\n }\n }\n };\n\n const processChildren = (f: ElementFragment) => {\n removeClones(f);\n for (const child of f.getChildElementFragments()) {\n processChildren(child);\n }\n };\n\n // 対象フラグメント自体のクローンを削除し、子エレメント以下を再帰処理\n removeClones(fragment);\n for (const child of fragment.getChildElementFragments()) {\n processChildren(child);\n }\n\n return Promise.all(tasks).then(() => undefined);\n }\n\n /**\n * 再帰的に値を初期化します。\n *\n * @param fragment 対象フラグメント\n */\n private static clearValues(fragment: ElementFragment): void {\n fragment.clearValue();\n for (const child of fragment.getChildElementFragments()) {\n Form.clearValues(child);\n }\n }\n\n /**\n * フラグメントとその子要素のメッセージをクリアします。\n *\n * @param fragment 対象フラグメント\n * @returns Promise(メッセージのクリアが完了したら解決される)\n */\n public static clearMessages(fragment: ElementFragment): Promise<void> {\n return resolveFormHaoriApi().clearMessages(\n fragment.getTarget(),\n ) as Promise<void>;\n }\n\n /**\n * キーに一致するフラグメントにエラーメッセージを追加します。\n * キーに一致するフラグメントが見つからない場合は、指定されたフラグメントにメッセージを追加します。\n *\n * @param fragment 対象フラグメント\n * @param key キー(ドット区切りの文字列)\n * @param message 追加するエラーメッセージ\n * @return Promise(メッセージの追加が完了したら解決される)\n */\n public static addErrorMessage(\n fragment: ElementFragment,\n key: string,\n message: string,\n ): Promise<void> {\n return Form.addMessage(fragment, key, message, 'error');\n }\n\n /**\n * キーに一致するフラグメントにレベル付きメッセージを追加します。\n * キーに一致するフラグメントが見つからない場合は、指定されたフラグメントにメッセージを追加します。\n *\n * @param fragment 対象フラグメント\n * @param key キー(ドット区切りの文字列)\n * @param message 追加するメッセージ\n * @param level メッセージのレベル(省略可能)\n * @return Promise(メッセージの追加が完了したら解決される)\n */\n public static addMessage(\n fragment: ElementFragment,\n key: string,\n message: string,\n level?: 'info' | 'warning' | 'error' | 'success',\n ): Promise<void> {\n const promises: Promise<void>[] = [];\n const activeHaori = resolveFormHaoriApi();\n const addMsgFn = (activeHaori as {addMessage?: typeof Haori.addMessage})\n .addMessage;\n const doAdd = (target: HTMLElement): Promise<void> =>\n typeof addMsgFn === 'function'\n ? (addMsgFn.call(activeHaori, target, message, level) as Promise<void>)\n : (activeHaori.addErrorMessage(target, message) as Promise<void>);\n\n const targetFragments = Form.findFragmentsByKey(fragment, key);\n targetFragments.forEach(targetFragment => {\n promises.push(doAdd(targetFragment.getTarget() as HTMLElement));\n });\n if (targetFragments.length === 0) {\n promises.push(doAdd(fragment.getTarget() as HTMLElement));\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * 指定されたキーに一致するフラグメントを検索します。\n *\n * @param fragment 対象フラグメント\n * @param key キー(ドット区切りの文字列)\n * @returns 一致するフラグメントの配列\n */\n public static findFragmentsByKey(\n fragment: ElementFragment,\n key: string,\n ): ElementFragment[] {\n return Form.findFragmentByKeyParts(fragment, key.split('.'));\n }\n\n /**\n * 指定されたキーに一致するフラグメントを検索します。\n * data-form-list属性で指定された場合はdata-row属性を持つ子要素の位置と添字が一致するものを対象とします。\n *\n * @param fragment 対象フラグメント\n * @param parts キーのパーツ\n * @returns 一致するフラグメントの配列\n */\n private static findFragmentByKeyParts(\n fragment: ElementFragment,\n parts: string[],\n ): ElementFragment[] {\n const results: ElementFragment[] = [];\n const key = parts[0];\n if (parts.length == 1) {\n const name = fragment.getAttribute('name');\n if (name === key) {\n results.push(fragment);\n }\n }\n if (fragment.hasAttribute(`${Env.prefix}form-object`)) {\n if (parts.length > 1) {\n const objectName = fragment.getAttribute(`${Env.prefix}form-object`);\n if (objectName === key) {\n fragment.getChildElementFragments().forEach(child => {\n results.push(...Form.findFragmentByKeyParts(child, parts.slice(1)));\n });\n }\n }\n } else if (fragment.hasAttribute(`${Env.prefix}form-list`)) {\n if (parts.length > 1) {\n const listName = fragment.getAttribute(`${Env.prefix}form-list`);\n const firstPoint = key.lastIndexOf('[');\n const lastPoint = key.lastIndexOf(']');\n if (firstPoint !== -1 && lastPoint !== -1 && firstPoint < lastPoint) {\n const rawKey = key.substring(0, firstPoint);\n if (listName === rawKey) {\n const indexString = key.substring(firstPoint + 1, lastPoint);\n const index = Number(indexString);\n if (isNaN(index)) {\n Log.error('Haori', `Invalid index: ${key}`);\n } else {\n const rows = fragment\n .getChildElementFragments()\n .filter(child => child.hasAttribute(`${Env.prefix}row`));\n if (index < rows.length) {\n results.push(\n ...Form.findFragmentByKeyParts(rows[index], parts.slice(1)),\n );\n }\n }\n }\n }\n }\n } else {\n fragment.getChildElementFragments().forEach(child => {\n results.push(...Form.findFragmentByKeyParts(child, parts));\n });\n }\n return results;\n }\n\n /**\n * 対象のフラグメントがフォームフラグメントであればそれを返し、\n * そうでなければ先祖要素をたどってフォームフラグメントを探します。\n *\n * @param fragment\n */\n public static getFormFragment(\n fragment: ElementFragment,\n ): ElementFragment | null {\n const element = fragment.getTarget();\n if (element instanceof HTMLFormElement) {\n return fragment;\n }\n const parent = fragment.getParent();\n if (parent) {\n return this.getFormFragment(parent);\n }\n return null;\n }\n}\n","/**\n * @fileoverview 仮想DOM実装\n *\n * メモリ上にノードツリーを保持し、DOMへの反映を非同期で行います。\n * DOMからの読み込みは行わず、オブザーバーとchangeイベントで更新されます。\n */\nimport Queue from './queue';\nimport Log from './log';\nimport Expression from './expression';\nimport Env from './env';\nimport Dev from './dev';\n\ninterface EvaluationProfilePlaceholderSnapshot {\n expression: string;\n calls: number;\n totalDurationMs: number;\n maxDurationMs: number;\n}\n\ninterface EvaluationProfileAttributeSnapshot {\n name: string;\n template: string;\n calls: number;\n totalDurationMs: number;\n maxDurationMs: number;\n placeholders: EvaluationProfilePlaceholderSnapshot[];\n}\n\ninterface EvaluationProfileTextSnapshot {\n childIndex: number;\n template: string;\n calls: number;\n totalDurationMs: number;\n maxDurationMs: number;\n placeholders: EvaluationProfilePlaceholderSnapshot[];\n}\n\ninterface EvaluationProfileElementSnapshot {\n elementId: string;\n tagName: string;\n attributes: EvaluationProfileAttributeSnapshot[];\n texts: EvaluationProfileTextSnapshot[];\n}\n\ntype EvaluationProfileContext =\n | {\n kind: 'attribute';\n element: HTMLElement;\n rawName: string;\n template: string;\n }\n | {\n kind: 'text';\n element: HTMLElement;\n childIndex: number;\n template: string;\n };\n\ninterface EvaluationProfileCounter {\n template: string;\n calls: number;\n totalDurationMs: number;\n maxDurationMs: number;\n placeholders: Map<string, EvaluationProfilePlaceholderCounter>;\n}\n\ninterface EvaluationProfilePlaceholderCounter {\n calls: number;\n totalDurationMs: number;\n maxDurationMs: number;\n}\n\ninterface EvaluationProfileElementStore {\n tagName: string;\n attributes: Map<string, EvaluationProfileCounter>;\n texts: Map<string, EvaluationProfileCounter>;\n}\n\n/**\n * 開発時の属性・テキスト評価回数を集計するレジストリです。\n */\nclass EvaluationProfileRegistry {\n /** globalThis に公開するキー */\n private static readonly GLOBAL_KEY = '__HAORI_EVALUATION_PROFILE__';\n\n /** エレメントごとの集計 */\n private static readonly ELEMENT_STORES = new Map<\n string,\n EvaluationProfileElementStore\n >();\n\n /**\n * 集計状態を初期化します。\n */\n public static reset(): void {\n EvaluationProfileRegistry.ELEMENT_STORES.clear();\n EvaluationProfileRegistry.ensureGlobalAccess();\n }\n\n /**\n * 現在の集計結果スナップショットを返します。\n *\n * @returns エレメントごとの集計結果\n */\n public static snapshot(): EvaluationProfileElementSnapshot[] {\n EvaluationProfileRegistry.ensureGlobalAccess();\n return [...EvaluationProfileRegistry.ELEMENT_STORES.entries()]\n .map(([elementId, store]) => ({\n elementId,\n tagName: store.tagName,\n attributes: [...store.attributes.entries()]\n .map(([name, counter]) => ({\n name,\n template: counter.template,\n calls: counter.calls,\n totalDurationMs: counter.totalDurationMs,\n maxDurationMs: counter.maxDurationMs,\n placeholders: EvaluationProfileRegistry.sortPlaceholders(\n counter.placeholders,\n ),\n }))\n .sort((left, right) => right.calls - left.calls),\n texts: [...store.texts.entries()]\n .map(([childIndex, counter]) => ({\n childIndex: Number(childIndex),\n template: counter.template,\n calls: counter.calls,\n totalDurationMs: counter.totalDurationMs,\n maxDurationMs: counter.maxDurationMs,\n placeholders: EvaluationProfileRegistry.sortPlaceholders(\n counter.placeholders,\n ),\n }))\n .sort((left, right) => right.calls - left.calls),\n }))\n .sort((left, right) => {\n const leftCalls =\n left.attributes.reduce((sum, item) => sum + item.calls, 0) +\n left.texts.reduce((sum, item) => sum + item.calls, 0);\n const rightCalls =\n right.attributes.reduce((sum, item) => sum + item.calls, 0) +\n right.texts.reduce((sum, item) => sum + item.calls, 0);\n return rightCalls - leftCalls;\n });\n }\n\n /**\n * 評価呼び出しを記録します。\n *\n * @param context 評価コンテキスト\n * @param expressions 今回評価した式一覧\n */\n public static record(\n context: EvaluationProfileContext | undefined,\n expressions: Array<{expression: string; durationMs: number}>,\n totalDurationMs: number,\n ): void {\n if (!Dev.isEnabled() || !context || expressions.length === 0) {\n return;\n }\n EvaluationProfileRegistry.ensureGlobalAccess();\n const store = EvaluationProfileRegistry.getOrCreateElementStore(\n context.element,\n );\n if (context.kind === 'attribute') {\n const counter = EvaluationProfileRegistry.getOrCreateCounter(\n store.attributes,\n context.rawName,\n context.template,\n );\n EvaluationProfileRegistry.updateCounter(\n counter,\n expressions,\n totalDurationMs,\n );\n return;\n }\n const counter = EvaluationProfileRegistry.getOrCreateCounter(\n store.texts,\n String(context.childIndex),\n context.template,\n );\n EvaluationProfileRegistry.updateCounter(\n counter,\n expressions,\n totalDurationMs,\n );\n }\n\n /**\n * globalThis から dev-only の取得窓口を参照できるようにします。\n */\n private static ensureGlobalAccess(): void {\n if (!Dev.isEnabled()) {\n return;\n }\n const globalRecord = globalThis as Record<string, unknown>;\n if (globalRecord[EvaluationProfileRegistry.GLOBAL_KEY] !== undefined) {\n return;\n }\n globalRecord[EvaluationProfileRegistry.GLOBAL_KEY] = {\n reset: () => EvaluationProfileRegistry.reset(),\n snapshot: () => EvaluationProfileRegistry.snapshot(),\n };\n }\n\n /**\n * エレメント単位の集計ストアを取得または初期化します。\n *\n * @param element 対象エレメント\n * @returns 集計ストア\n */\n private static getOrCreateElementStore(\n element: HTMLElement,\n ): EvaluationProfileElementStore {\n const elementId = EvaluationProfileRegistry.createElementId(element);\n const existing = EvaluationProfileRegistry.ELEMENT_STORES.get(elementId);\n if (existing) {\n return existing;\n }\n const store: EvaluationProfileElementStore = {\n tagName: element.tagName.toLowerCase(),\n attributes: new Map(),\n texts: new Map(),\n };\n EvaluationProfileRegistry.ELEMENT_STORES.set(elementId, store);\n return store;\n }\n\n /**\n * カウンタを取得または初期化します。\n *\n * @param counters 種別ごとのカウンタマップ\n * @param key カウンタキー\n * @param template 元テンプレート\n * @returns カウンタ\n */\n private static getOrCreateCounter(\n counters: Map<string, EvaluationProfileCounter>,\n key: string,\n template: string,\n ): EvaluationProfileCounter {\n const existing = counters.get(key);\n if (existing) {\n return existing;\n }\n const counter: EvaluationProfileCounter = {\n template,\n calls: 0,\n totalDurationMs: 0,\n maxDurationMs: 0,\n placeholders: new Map(),\n };\n counters.set(key, counter);\n return counter;\n }\n\n /**\n * プレースホルダカウンタを取得または初期化します。\n *\n * @param placeholders プレースホルダカウンタマップ\n * @param expression 式文字列\n * @returns プレースホルダカウンタ\n */\n private static getOrCreatePlaceholder(\n placeholders: Map<string, EvaluationProfilePlaceholderCounter>,\n expression: string,\n ): EvaluationProfilePlaceholderCounter {\n const existing = placeholders.get(expression);\n if (existing) {\n return existing;\n }\n const counter: EvaluationProfilePlaceholderCounter = {\n calls: 0,\n totalDurationMs: 0,\n maxDurationMs: 0,\n };\n placeholders.set(expression, counter);\n return counter;\n }\n\n /**\n * カウンタへ今回の評価結果を加算します。\n *\n * @param counter 更新対象カウンタ\n * @param expressions 今回評価した式一覧\n * @param totalDurationMs 今回の総所要時間\n */\n private static updateCounter(\n counter: EvaluationProfileCounter,\n expressions: Array<{expression: string; durationMs: number}>,\n totalDurationMs: number,\n ): void {\n counter.calls += 1;\n counter.totalDurationMs += totalDurationMs;\n counter.maxDurationMs = Math.max(counter.maxDurationMs, totalDurationMs);\n expressions.forEach(expression => {\n const placeholder = EvaluationProfileRegistry.getOrCreatePlaceholder(\n counter.placeholders,\n expression.expression,\n );\n placeholder.calls += 1;\n placeholder.totalDurationMs += expression.durationMs;\n placeholder.maxDurationMs = Math.max(\n placeholder.maxDurationMs,\n expression.durationMs,\n );\n });\n }\n\n /**\n * プレースホルダ集計を calls 降順で返します。\n *\n * @param placeholders プレースホルダ集計\n * @returns スナップショット\n */\n private static sortPlaceholders(\n placeholders: Map<string, EvaluationProfilePlaceholderCounter>,\n ): EvaluationProfilePlaceholderSnapshot[] {\n return [...placeholders.entries()]\n .map(([expression, counter]) => ({\n expression,\n calls: counter.calls,\n totalDurationMs: counter.totalDurationMs,\n maxDurationMs: counter.maxDurationMs,\n }))\n .sort((left, right) => {\n if (right.calls !== left.calls) {\n return right.calls - left.calls;\n }\n return right.totalDurationMs - left.totalDurationMs;\n });\n }\n\n /**\n * 現在時刻のタイムスタンプを返します。\n *\n * @returns ミリ秒\n */\n private static now(): number {\n return globalThis.performance?.now() ?? Date.now();\n }\n\n /**\n * 評価処理の所要時間を計測します。\n *\n * @param callback 計測対象\n * @returns 結果と所要時間\n */\n public static measure<T>(callback: () => T): {\n value: T;\n durationMs: number;\n } {\n const startedAt = EvaluationProfileRegistry.now();\n const value = callback();\n return {\n value,\n durationMs: EvaluationProfileRegistry.now() - startedAt,\n };\n }\n\n /**\n * エレメント識別子を生成します。\n *\n * @param element 対象エレメント\n * @returns 識別子\n */\n private static createElementId(element: HTMLElement): string {\n const segments: string[] = [];\n let current: Element | null = element;\n while (current) {\n let segment = current.tagName.toLowerCase();\n const rawId = current.getAttribute('id') || '';\n if (rawId.trim() !== '') {\n segment += `#${rawId.trim()}`;\n segments.unshift(segment);\n break;\n }\n const deriveName = current.getAttribute(`${Env.prefix}derive-name`);\n if (deriveName && deriveName.trim() !== '') {\n segment += `[${Env.prefix}derive-name=\"${deriveName.trim()}\"]`;\n }\n const parent: Element | null = current.parentElement;\n if (parent) {\n segment += `:nth-child(${[...parent.children].indexOf(current) + 1})`;\n }\n segments.unshift(segment);\n current = parent;\n }\n return segments.join(' > ');\n }\n}\n\n/**\n * 属性評価結果の詳細です。\n */\nexport interface AttributeEvaluationDetail {\n /** 評価済みの値 */\n value: string | false | unknown | null;\n\n /** 未解決参照が含まれていたかどうか */\n hasUnresolvedReference: boolean;\n}\n\n/**\n * 仮想DOMのフラグメントの抽象クラス。\n */\nexport default abstract class Fragment {\n /** フラグメントの対象ノードに対するキャッシュ */\n protected static readonly FRAGMENT_CACHE = new WeakMap<Node, Fragment>();\n\n /**\n * フラグメントを取得もしくは作成します。\n *\n * @param node 対象ノード\n * @returns フラグメント\n */\n public static get(node: HTMLElement): ElementFragment;\n public static get(node: Text): TextFragment;\n public static get(node: Comment): CommentFragment;\n public static get(node: Node | null): Fragment | null;\n public static get(node: Node | null): Fragment | null {\n if (node == null) {\n return null;\n }\n if (Fragment.FRAGMENT_CACHE.has(node)) {\n return Fragment.FRAGMENT_CACHE.get(node)!;\n }\n let fragment;\n switch (node.nodeType) {\n case Node.ELEMENT_NODE:\n fragment = new ElementFragment(node as HTMLElement);\n break;\n case Node.TEXT_NODE:\n fragment = new TextFragment(node as Text);\n break;\n case Node.COMMENT_NODE:\n fragment = new CommentFragment(node as Comment);\n break;\n default:\n Log.warn('[Haori]', 'Unsupported node type:', node.nodeType);\n return null;\n }\n return fragment;\n }\n\n /** 親フラグメント */\n protected parent: ElementFragment | null = null;\n\n /** 対象ノード */\n protected readonly target: Node;\n\n /** フラグメントがDOMにマウントされているかどうか */\n protected mounted = false;\n\n /** ノード更新スキップフラグ(オブザーバーによる無限ループ対応) */\n protected skipMutationNodes = false;\n\n /**\n * フラグメントのコンストラクタ。\n *\n * @param target 対象ノード\n */\n protected constructor(target: Node) {\n this.target = target;\n Fragment.FRAGMENT_CACHE.set(target, this);\n }\n\n /**\n * skipMutationNodesフラグの値を取得します。\n *\n * @returns skipMutationNodesの値\n */\n public isSkipMutationNodes(): boolean {\n return this.skipMutationNodes;\n }\n\n /**\n * フラグメントをDOMから除去します。\n *\n * @return 除去のPromise\n */\n public unmount(): Promise<void> {\n if (!this.mounted || this.skipMutationNodes) {\n return Promise.resolve();\n }\n if (this.parent) {\n const parent = this.parent;\n const prevSkip = parent.skipMutationNodes;\n return Queue.enqueue(() => {\n parent.skipMutationNodes = true;\n if (this.target.parentNode === parent.getTarget()) {\n parent.getTarget().removeChild(this.target);\n }\n this.mounted = false;\n }).finally(() => {\n parent.skipMutationNodes = prevSkip;\n }) as Promise<void>;\n } else {\n // 親フラグメント情報が無くても、DOM 上に親ノードが存在する場合は安全に除去する。\n const host = this.target.parentNode as HTMLElement | null;\n if (host) {\n return Queue.enqueue(() => {\n if (this.target.parentNode === host) {\n host.removeChild(this.target);\n }\n this.mounted = false;\n }) as Promise<void>;\n }\n this.mounted = false;\n }\n return Promise.resolve();\n }\n\n /**\n * フラグメントをDOMに追加します。\n *\n * @return 追加のPromise\n */\n public mount(): Promise<void> {\n if (this.mounted || this.skipMutationNodes) {\n return Promise.resolve();\n }\n if (this.parent) {\n const parent = this.parent;\n const prevSkip = parent.skipMutationNodes;\n return Queue.enqueue(() => {\n parent.skipMutationNodes = true;\n if (this.target.parentNode !== parent.getTarget()) {\n // 既に同じ親なら何もしない\n parent.getTarget().appendChild(this.target);\n }\n this.mounted = true;\n }).finally(() => {\n parent.skipMutationNodes = prevSkip;\n }) as Promise<void>;\n }\n return Promise.resolve();\n }\n\n /**\n * フラグメントのマウント状態を取得します。\n *\n * @returns マウント状態\n */\n public isMounted(): boolean {\n return this.mounted;\n }\n\n /**\n * フラグメントのマウント状態を設定します。\n *\n * @param mounted マウント状態\n */\n public setMounted(mounted: boolean): void {\n this.mounted = mounted;\n }\n\n /**\n * フラグメントをクローンします。\n *\n * @returns クローンされたフラグメント\n */\n public abstract clone(): Fragment;\n\n /**\n * フラグメントとノードを削除します。\n *\n * @param unmount DOMからの除去を行うかどうか(内部の子呼び出しの場合のみfalseとする)\n * @return 除去のPromise\n */\n public remove(unmount = true): Promise<void> {\n if (this.parent) {\n this.parent.removeChild(this);\n }\n Fragment.FRAGMENT_CACHE.delete(this.target);\n if (unmount) {\n return this.unmount();\n }\n return Promise.resolve();\n }\n\n /**\n * 対象ノードを取得します。\n *\n * @returns 対象ノード\n */\n public getTarget(): Node {\n return this.target;\n }\n\n /**\n * 親フラグメントを取得します。\n *\n * @returns 親フラグメント\n */\n public getParent(): ElementFragment | null {\n return this.parent;\n }\n\n /**\n * 親フラグメントを設定します。\n *\n * @param parent 親フラグメント\n */\n public setParent(parent: ElementFragment | null): void {\n this.parent = parent;\n }\n}\n\n/**\n * エレメントフラグメント。\n * DOM要素を表現し、子ノードを持つことができます。\n */\nexport class ElementFragment extends Fragment {\n /** HTML 真偽属性名のセット */\n private static readonly BOOLEAN_ATTRIBUTES = new Set([\n 'allowfullscreen',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'hidden',\n 'inert',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected',\n ]);\n\n /** inputイベントを発生させるタイプ */\n private readonly INPUT_EVENT_TYPES = [\n 'text',\n 'password',\n 'email',\n 'url',\n 'tel',\n 'search',\n 'number',\n 'range',\n 'color',\n 'date',\n 'datetime-local',\n 'month',\n 'time',\n 'week',\n ];\n\n /** 子フラグメントのリスト */\n private readonly children: Fragment[] = [];\n\n /** 属性名に対する属性情報のマップ */\n private readonly attributeMap = new Map<string, AttributeContents>();\n\n /** バインドデータ */\n private bindingData: Record<string, unknown> | null = null;\n\n /** 子孫要素へ公開する派生バインドデータ */\n private derivedBindingData: Record<string, unknown> | null = null;\n\n /** バインドデータのキャッシュ */\n private bindingDataCache: Record<string, unknown> | null = null;\n\n /** 子孫要素向けバインドデータのキャッシュ */\n private descendantBindingDataCache: Record<string, unknown> | null = null;\n\n /** 表示状態 */\n private visible = true;\n\n /** 元の display 値 */\n private display: string | null = null;\n\n /** 元の display の優先度 */\n private displayPriority: string | null = null;\n\n /** each用のテンプレート */\n private template: ElementFragment | null = null;\n\n /** each比較用のキー */\n private listKey: string | null = null;\n\n /** 直近に描画した each 行の入力署名 */\n private renderSignature: string | null = null;\n\n /** 直近に描画した data-each 全体の入力署名 */\n private eachInputSignature: string | null = null;\n\n /** 直近に公開した data-derive subtree の入力署名 */\n private deriveSubtreeSignature: string | null = null;\n\n /** 直近に評価した data-derive の入力署名 */\n private deriveInputSignature: string | null = null;\n\n /** fresh clone 初期化を subtree ごと省略できるかどうか */\n private freshInitializationSkippable = false;\n\n /** valueプロパティの値 */\n private value: string | number | boolean | null = null;\n\n /** 属性更新スキップフラグ(オブザーバーによる無限ループ対応) */\n private skipMutationAttributes = false;\n\n /** 値変更スキップフラグ(更新イベントによる無限ループ対応) */\n private skipChangeValue = false;\n\n /**\n * エレメントフラグメントのコンストラクタ。\n * アトリビュートや子フラグメントの作成も行います。\n *\n * @param target 対象エレメント\n */\n public constructor(target: HTMLElement) {\n super(target);\n this.syncValue();\n target.getAttributeNames().forEach(name => {\n const value = target.getAttribute(name);\n if (value !== null && !this.attributeMap.has(name)) {\n const contents = new AttributeContents(name, value);\n this.attributeMap.set(name, contents);\n }\n });\n target.childNodes.forEach(node => {\n const childFragment = Fragment.get(node);\n childFragment!.setParent(this);\n this.children.push(childFragment!);\n });\n }\n\n /**\n * 子フラグメントのリストを取得します。\n *\n * @returns 子フラグメントのリスト\n */\n public getChildren(): Fragment[] {\n return this.children;\n }\n\n /**\n * 子エレメントフラグメントのリストを取得します。\n *\n * @returns 子エレメントフラグメントのリスト\n */\n public getChildElementFragments(): ElementFragment[] {\n return this.children.filter(\n child => child instanceof ElementFragment,\n ) as ElementFragment[];\n }\n\n /**\n * 子フラグメントをリストに追加します。\n * DOMの追加は行いません。\n *\n * @param child 追加する子フラグメント\n */\n public pushChild(child: Fragment) {\n this.children.push(child);\n child.setParent(this);\n }\n\n /**\n * 子フラグメントをリストから削除します。\n * DOMからの削除は行いません。\n *\n * @param child 削除する子フラグメント\n */\n public removeChild(child: Fragment): void {\n const index = this.children.indexOf(child);\n if (index < 0) {\n Log.warn('[Haori]', 'Child fragment not found.', child);\n return;\n }\n this.children.splice(index, 1);\n child.setParent(null);\n }\n\n /**\n * フラグメントをクローンします。\n *\n * @returns クローンされたフラグメント\n */\n public clone(): ElementFragment {\n const clone = new ElementFragment(\n this.target.cloneNode(false) as HTMLElement,\n );\n // DOM 属性は評価後の値になっているため、\n // クローンでは attributeMap をコピーしてテンプレート式を保持します。\n this.attributeMap.forEach((contents, name) => {\n clone.attributeMap.set(name, contents);\n });\n this.children.forEach(child => {\n const childClone = child.clone();\n clone.getTarget().appendChild(childClone.getTarget());\n clone.pushChild(childClone);\n });\n clone.mounted = false;\n clone.bindingData = this.bindingData;\n clone.derivedBindingData = this.derivedBindingData;\n clone.clearBindingDataCache();\n clone.visible = true;\n clone.display = this.display;\n clone.displayPriority = this.displayPriority;\n clone.template = this.template;\n clone.renderSignature = this.renderSignature;\n clone.eachInputSignature = this.eachInputSignature;\n clone.deriveSubtreeSignature = null;\n clone.deriveInputSignature = null;\n clone.freshInitializationSkippable = this.freshInitializationSkippable;\n clone.normalizeClonedVisibilityState();\n return clone;\n }\n\n /**\n * clone 時に runtime の hidden 状態だけを落とします。\n */\n private normalizeClonedVisibilityState(): void {\n if (\n this.visible === false ||\n this.getTarget().style.display === 'none' ||\n this.getTarget().hasAttribute(`${Env.prefix}if-false`)\n ) {\n this.visible = true;\n this.display = null;\n this.displayPriority = null;\n this.getTarget().style.removeProperty('display');\n this.getTarget().removeAttribute(`${Env.prefix}if-false`);\n }\n this.children.forEach(child => {\n if (child instanceof ElementFragment) {\n child.normalizeClonedVisibilityState();\n }\n });\n }\n\n /**\n * フラグメントとノードを削除します。\n *\n * @param unmount DOMからの除去を行うかどうか(内部の子呼び出しの場合のみfalseとする)\n * @return 除去のPromise\n */\n public remove(unmount = true): Promise<void> {\n const promises: Promise<void>[] = [];\n this.children.forEach(child => {\n promises.push(child.remove(false));\n });\n this.children.length = 0;\n this.attributeMap.clear();\n this.bindingData = null;\n this.bindingDataCache = null;\n this.derivedBindingData = null;\n this.descendantBindingDataCache = null;\n if (this.template) {\n promises.push(this.template.remove(false));\n this.template = null;\n }\n this.eachInputSignature = null;\n this.deriveSubtreeSignature = null;\n this.deriveInputSignature = null;\n promises.push(super.remove(unmount));\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * フラグメントの対象エレメントを取得します。\n *\n * @returns フラグメントの対象エレメント\n */\n public getTarget(): HTMLElement {\n return this.target as HTMLElement;\n }\n\n /**\n * 継承を考慮したバインドデータを取得します。\n *\n * @returns バインドデータのオブジェクト\n */\n public getBindingData(): Record<string, unknown> {\n if (this.bindingDataCache) {\n return this.bindingDataCache;\n }\n this.bindingDataCache = {};\n if (this.parent) {\n Object.assign(\n this.bindingDataCache,\n this.parent.getDescendantBindingData(),\n );\n }\n if (this.bindingData) {\n Object.assign(this.bindingDataCache, this.bindingData);\n }\n return this.bindingDataCache;\n }\n\n /**\n * 子孫要素向けのバインドデータを取得します。\n *\n * @returns 子孫要素向けのバインドデータ\n */\n public getDescendantBindingData(): Record<string, unknown> {\n if (this.descendantBindingDataCache) {\n return this.descendantBindingDataCache;\n }\n this.descendantBindingDataCache = {...this.getBindingData()};\n if (this.derivedBindingData) {\n Object.assign(this.descendantBindingDataCache, this.derivedBindingData);\n }\n return this.descendantBindingDataCache;\n }\n\n /**\n * 生のバインドデータを取得します。\n *\n * @returns 生のバインドデータ\n */\n public getRawBindingData(): Record<string, unknown> | null {\n return this.bindingData;\n }\n\n /**\n * 生の派生バインドデータを取得します。\n *\n * @returns 生の派生バインドデータ\n */\n public getRawDerivedBindingData(): Record<string, unknown> | null {\n return this.derivedBindingData;\n }\n\n /**\n * バインドデータを設定します。\n *\n * @param data バインドデータ\n */\n public setBindingData(data: Record<string, unknown>): void {\n this.bindingData = data;\n this.clearBindingDataCache();\n }\n\n /**\n * 子孫要素向けの派生バインドデータを設定します。\n *\n * @param data 派生バインドデータ。解除する場合は null\n */\n public setDerivedBindingData(data: Record<string, unknown> | null): void {\n this.derivedBindingData = data;\n this.clearBindingDataCache();\n }\n\n /**\n * 親フラグメントを設定します。バインドデータキャッシュをクリアします。\n *\n * @param parent 親フラグメント\n */\n public override setParent(parent: ElementFragment | null): void {\n if (this.parent === parent) {\n return;\n }\n this.parent = parent;\n this.clearBindingDataCache();\n }\n\n /**\n * バインドデータのキャッシュをクリアします。\n */\n public clearBindingDataCache(): void {\n this.bindingDataCache = null;\n this.descendantBindingDataCache = null;\n this.children.forEach(child => {\n if (child instanceof ElementFragment) {\n child.clearBindingDataCache();\n }\n });\n }\n\n /**\n * フラグメントのテンプレートを取得します。\n *\n * @returns テンプレート\n */\n public getTemplate(): ElementFragment | null {\n return this.template;\n }\n\n /**\n * フラグメントのテンプレートを設定します。\n *\n * @param template フラグメントのテンプレート\n */\n public setTemplate(template: ElementFragment | null): void {\n this.template = template;\n }\n\n /**\n * 比較用リストキーを設定します。\n *\n * @param key 比較用リストキー\n */\n public setListKey(key: string): void {\n this.listKey = key;\n }\n\n /**\n * 比較用リストキーを取得します。\n *\n * @returns 比較用リストキー\n */\n public getListKey(): string | null {\n return this.listKey;\n }\n\n /**\n * 直近に描画した each 行の入力署名を取得します。\n *\n * @returns 入力署名\n */\n public getRenderSignature(): string | null {\n return this.renderSignature;\n }\n\n /**\n * 直近に描画した each 行の入力署名を設定します。\n *\n * @param signature 入力署名\n */\n public setRenderSignature(signature: string | null): void {\n this.renderSignature = signature;\n }\n\n /**\n * 直近に描画した data-each 全体の入力署名を取得します。\n *\n * @returns 入力署名\n */\n public getEachInputSignature(): string | null {\n return this.eachInputSignature;\n }\n\n /**\n * 直近に描画した data-each 全体の入力署名を設定します。\n *\n * @param signature 入力署名\n */\n public setEachInputSignature(signature: string | null): void {\n this.eachInputSignature = signature;\n }\n\n /**\n * 直近に公開した data-derive subtree の入力署名を取得します。\n *\n * @returns 入力署名\n */\n public getDeriveSubtreeSignature(): string | null {\n return this.deriveSubtreeSignature;\n }\n\n /**\n * 直近に公開した data-derive subtree の入力署名を設定します。\n *\n * @param signature 入力署名\n */\n public setDeriveSubtreeSignature(signature: string | null): void {\n this.deriveSubtreeSignature = signature;\n }\n\n /**\n * 直近に評価した data-derive の入力署名を取得します。\n *\n * @returns 入力署名\n */\n public getDeriveInputSignature(): string | null {\n return this.deriveInputSignature;\n }\n\n /**\n * 直近に評価した data-derive の入力署名を設定します。\n *\n * @param signature 入力署名\n */\n public setDeriveInputSignature(signature: string | null): void {\n this.deriveInputSignature = signature;\n }\n\n /**\n * fresh clone 初期化を subtree ごと省略できるかどうかを返します。\n *\n * @returns 省略可能なら true\n */\n public isFreshInitializationSkippable(): boolean {\n return this.freshInitializationSkippable;\n }\n\n /**\n * fresh clone 初期化を subtree ごと省略できるかどうかを設定します。\n *\n * @param skippable 省略可能なら true\n */\n public setFreshInitializationSkippable(skippable: boolean): void {\n this.freshInitializationSkippable = skippable;\n }\n\n /**\n * 入力エレメントに値を設定します。\n * チェックボックとラジオボタンの場合は値に一致するかどうかでチェック状態を変更します。\n *\n * @param value 値\n * @returns エレメントの更新のPromise\n */\n public setValue(value: string | number | boolean | null): Promise<void> {\n return this.applyValue(value, true);\n }\n\n /**\n * 入力エレメントに値をイベントなしで設定します。\n * フォームの bindingData 反映時に内部同期として利用します。\n *\n * @param value 値\n * @returns エレメントの更新のPromise\n */\n public syncBindingValue(\n value: string | number | boolean | null,\n ): Promise<void> {\n return this.applyValue(value, false);\n }\n\n /**\n * 入力エレメントに値を設定します。\n * 必要に応じて入力系イベントも発火します。\n *\n * @param value 値\n * @param dispatchEvents input/change イベントを発火するかどうか\n * @returns エレメントの更新のPromise\n */\n private applyValue(\n value: string | number | boolean | null,\n dispatchEvents: boolean,\n ): Promise<void> {\n if (this.skipChangeValue) {\n return Promise.resolve();\n }\n if (this.value === value) {\n return Promise.resolve();\n }\n const element = this.getTarget();\n if (\n element instanceof HTMLInputElement &&\n (element.type === 'checkbox' || element.type === 'radio')\n ) {\n const result = this.getAttribute('value');\n const isBooleanCheckbox =\n element.type === 'checkbox' && result === 'true';\n let newChecked: boolean;\n if (isBooleanCheckbox) {\n newChecked = value === true || value === 'true';\n } else if (result === 'false') {\n newChecked = value === false;\n } else {\n newChecked = result === String(value);\n }\n this.value = isBooleanCheckbox ? newChecked : newChecked ? value : null;\n if (element.checked === newChecked) {\n return Promise.resolve();\n }\n this.skipChangeValue = true;\n return Queue.enqueue(() => {\n element.checked = newChecked;\n if (dispatchEvents) {\n element.dispatchEvent(new Event('change', {bubbles: true}));\n }\n }).finally(() => {\n this.skipChangeValue = false;\n }) as Promise<void>;\n } else if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n this.value = value;\n this.skipChangeValue = true;\n return Queue.enqueue(() => {\n element.value = value === null ? '' : String(value);\n if (dispatchEvents) {\n if (\n (element instanceof HTMLInputElement &&\n this.INPUT_EVENT_TYPES.includes(element.type)) ||\n element instanceof HTMLTextAreaElement\n ) {\n element.dispatchEvent(new Event('input', {bubbles: true}));\n }\n element.dispatchEvent(new Event('change', {bubbles: true}));\n }\n }).finally(() => {\n this.skipChangeValue = false;\n }) as Promise<void>;\n } else {\n Log.warn(\n '[Haori]',\n 'setValue is not supported for this element type.',\n element,\n );\n return Promise.resolve();\n }\n }\n\n /**\n * 入力エレメントの値を取得します。\n * DOM要素の現在の値と同期します。\n *\n * @returns 入力エレメントの値\n */\n public getValue(): string | number | boolean | null {\n return this.value;\n }\n\n /**\n * 内部の値をクリアします。エレメントのvalue値は変化しません。\n */\n public clearValue() {\n this.value = null;\n }\n\n /**\n * 内部の値をDOMの値と同期します。\n * changeイベント時など、DOM値が変更された後に呼び出されます。\n */\n public syncValue() {\n const element = this.getTarget();\n if (element instanceof HTMLInputElement) {\n if (element.type === 'checkbox' || element.type === 'radio') {\n const isBooleanCheckbox =\n element.type === 'checkbox' && element.value === 'true';\n if (element.checked) {\n const value = element.value;\n if (isBooleanCheckbox) {\n this.value = true;\n } else if (value === 'false') {\n this.value = false;\n } else {\n this.value = value;\n }\n } else {\n // チェックボックスがOFFの場合\n const value = element.value;\n if (isBooleanCheckbox) {\n this.value = false;\n } else if (value === 'false') {\n this.value = true;\n } else {\n this.value = null;\n }\n }\n } else {\n this.value = element.value;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n this.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n this.value = element.value;\n }\n }\n\n /**\n * 属性の値を評価して設定します。\n * 評価値がfalseの場合は属性を削除します。\n * 矯正評価属性の場合は元の値を設定します。\n *\n * @param name 属性名\n * @param value 属性値\n * @returns 属性の更新のPromise\n */\n public setAttribute(\n name: string,\n value: string | null,\n fromObserver = false,\n ): Promise<void> {\n return this.setAttributeInternal(name, name, value, true, fromObserver);\n }\n\n /**\n * data-attr-* の生値を保持しつつ、別名の属性へ評価結果を反映します。\n *\n * @param rawName 生の属性名\n * @param targetName 反映先の属性名\n * @param value 生の属性値\n * @returns 属性更新の Promise\n */\n public setAliasedAttribute(\n rawName: string,\n targetName: string,\n value: string | null,\n fromObserver = false,\n ): Promise<void> {\n return this.setAttributeInternal(\n rawName,\n targetName,\n value,\n false,\n fromObserver,\n );\n }\n\n /**\n * data-attr-* の生属性と反映先属性を同時に削除します。\n *\n * @param rawName 生の属性名\n * @param targetName 反映先の属性名\n * @returns 属性削除の Promise\n */\n public removeAliasedAttribute(\n rawName: string,\n targetName: string,\n ): Promise<void> {\n if (this.skipMutationAttributes) {\n return Promise.resolve();\n }\n this.attributeMap.delete(rawName);\n this.skipMutationAttributes = true;\n const element = this.getTarget();\n return Queue.enqueue(() => {\n element.removeAttribute(rawName);\n if (targetName !== rawName) {\n element.removeAttribute(targetName);\n }\n }).finally(() => {\n this.skipMutationAttributes = false;\n }) as Promise<void>;\n }\n\n /**\n * 生の属性値を保持しつつ、必要に応じて別名属性へ評価結果を反映します。\n *\n * @param rawName 生の属性名\n * @param targetName 反映先の属性名\n * @param value 生の属性値\n * @param syncValueProperty value 属性更新時に DOM property も同期するかどうか\n * @returns 属性更新の Promise\n */\n private setAttributeInternal(\n rawName: string,\n targetName: string,\n value: string | null,\n syncValueProperty: boolean,\n fromObserver = false,\n ): Promise<void> {\n if (this.skipMutationAttributes) {\n return Promise.resolve();\n }\n if (value === null) {\n if (rawName === targetName) {\n return this.removeAttribute(rawName);\n }\n return this.removeAliasedAttribute(rawName, targetName);\n }\n const contents = new AttributeContents(rawName, value);\n if (fromObserver) {\n // MutationObserver経由の書き戻し(展開済み値)でテンプレート式を含む既存エントリを上書きしない。\n // (例: href=\"...{{customerCode}}...\" が展開された後にObserverが展開済み値を再セットするのを防ぐ)\n const existing = this.attributeMap.get(rawName);\n if (\n existing &&\n (existing.isEvaluate || existing.isForceEvaluation()) &&\n !contents.isEvaluate &&\n !contents.isForceEvaluation()\n ) {\n this.skipMutationAttributes = true;\n return Queue.enqueue(() => {}).finally(() => {\n this.skipMutationAttributes = false;\n }) as Promise<void>;\n }\n }\n this.attributeMap.set(rawName, contents);\n const element = this.getTarget();\n const detail = contents.evaluateDetailed(this.getBindingData(), {\n kind: 'attribute',\n element,\n rawName,\n template: value,\n });\n const hasTemplateExpression = contents.isEvaluate || contents.isRawEvaluate;\n const isBooleanAttribute =\n rawName === targetName &&\n ElementFragment.BOOLEAN_ATTRIBUTES.has(targetName.toLowerCase());\n const isSingleExpression = contents.isSingleExpression();\n const joinedValue = TextContents.joinEvaluateResults(detail.results);\n const evaluatedValue =\n detail.results.length === 1 ? detail.results[0] : joinedValue;\n const shouldRemoveTarget =\n !contents.isForceEvaluation() &&\n (targetName !== rawName\n ? detail.hasUnresolvedReference ||\n evaluatedValue === null ||\n evaluatedValue === undefined ||\n evaluatedValue === false\n : isBooleanAttribute\n ? detail.hasUnresolvedReference ||\n evaluatedValue === null ||\n evaluatedValue === undefined ||\n evaluatedValue === false\n : isSingleExpression\n ? detail.hasUnresolvedReference ||\n evaluatedValue === null ||\n evaluatedValue === undefined ||\n evaluatedValue === false\n : hasTemplateExpression && joinedValue === '');\n const result = contents.isForceEvaluation()\n ? value\n : isSingleExpression\n ? evaluatedValue\n : joinedValue;\n const shouldSyncValueProperty =\n syncValueProperty &&\n contents.isEvaluate &&\n targetName === 'value' &&\n ((element instanceof HTMLInputElement &&\n this.INPUT_EVENT_TYPES.includes(element.type)) ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement);\n const stringResult =\n shouldRemoveTarget || result === null || result === false\n ? null\n : String(result);\n const requiresRawAttributeWrite =\n rawName !== targetName && element.getAttribute(rawName) !== value;\n const requiresTargetAttributeWrite =\n stringResult === null\n ? element.hasAttribute(targetName)\n : element.getAttribute(targetName) !== stringResult;\n const requiresValuePropertyWrite =\n shouldSyncValueProperty &&\n stringResult !== null &&\n element.value !== stringResult;\n if (\n !requiresRawAttributeWrite &&\n !requiresTargetAttributeWrite &&\n !requiresValuePropertyWrite\n ) {\n if (shouldSyncValueProperty && stringResult !== null) {\n this.value = stringResult;\n }\n return Promise.resolve();\n }\n this.skipMutationAttributes = true;\n return Queue.enqueue(() => {\n if (requiresRawAttributeWrite) {\n element.setAttribute(rawName, value);\n }\n if (stringResult === null) {\n element.removeAttribute(targetName);\n } else {\n if (requiresTargetAttributeWrite) {\n element.setAttribute(targetName, stringResult);\n }\n // element.setAttribute('value', ...) は defaultValue のみ更新するため、\n // setValue と同じ対象には element.value も反映して DOM と内部状態を揃える。\n if (shouldSyncValueProperty) {\n this.value = stringResult;\n if (requiresValuePropertyWrite) {\n element.value = stringResult;\n }\n }\n }\n }).finally(() => {\n this.skipMutationAttributes = false;\n }) as Promise<void>;\n }\n\n /**\n * 属性の値を削除します。\n *\n * @param name 属性名\n * @returns 属性の削除のPromise\n */\n public removeAttribute(name: string): Promise<void> {\n if (this.skipMutationAttributes) {\n return Promise.resolve();\n }\n this.attributeMap.delete(name);\n this.skipMutationAttributes = true;\n const element = this.getTarget();\n return Queue.enqueue(() => {\n element.removeAttribute(name);\n }).finally(() => {\n this.skipMutationAttributes = false;\n }) as Promise<void>;\n }\n\n /**\n * 属性の評価された値を取得します。\n * 複数の評価値がある場合は結合して返します。\n *\n * @param name 属性名\n * @returns 評価された値\n */\n public getAttribute(name: string): string | false | unknown | null {\n const detail = this.getAttributeEvaluation(name);\n return detail?.value ?? null;\n }\n\n /**\n * 属性の評価値と未解決参照の有無を取得します。\n *\n * @param name 属性名\n * @returns 属性評価の詳細。属性が存在しない場合は null\n */\n public getAttributeEvaluation(\n name: string,\n ): AttributeEvaluationDetail | null {\n const contents = this.attributeMap.get(name);\n if (contents === undefined) {\n return null;\n }\n const detail = contents.evaluateDetailed(this.getBindingData(), {\n kind: 'attribute',\n element: this.getTarget(),\n rawName: name,\n template: contents.getValue(),\n });\n if (detail.results.length === 1) {\n return {\n value: detail.results[0],\n hasUnresolvedReference: detail.hasUnresolvedReference,\n };\n }\n return {\n value: TextContents.joinEvaluateResults(detail.results),\n hasUnresolvedReference: detail.hasUnresolvedReference,\n };\n }\n\n /**\n * 属性の生の値を取得します。\n *\n * @param name 属性名\n * @returns 生の属性値\n */\n public getRawAttribute(name: string): string | null {\n const contents = this.attributeMap.get(name);\n if (contents === undefined) {\n return null;\n }\n return contents.getValue();\n }\n\n /**\n * 属性名のリストを取得します。\n *\n * @return 属性名のリスト\n */\n public getAttributeNames(): string[] {\n return Array.from(this.attributeMap.keys());\n }\n\n /**\n * 属性の有無を確認します。\n *\n * @param name 属性名\n * @returns 属性の有無\n */\n public hasAttribute(name: string): boolean {\n return this.attributeMap.has(name);\n }\n\n /**\n * DOM上の順序から、参照フラグメントに対応する children 配列の挿入位置を推定します。\n *\n * @param referenceChild 参照フラグメント\n * @param insertAfter 参照位置の後ろに挿入するかどうか\n * @returns 挿入位置。解決できない場合はnull\n */\n private resolveInsertionPointFromDom(\n referenceChild: Fragment,\n insertAfter: boolean,\n ): {index: number; referenceNode: Node | null} | null {\n const referenceNode = referenceChild.getTarget();\n if (referenceNode.parentNode !== this.target) {\n return null;\n }\n\n const insertionReferenceNode = insertAfter\n ? referenceNode.nextSibling\n : referenceNode;\n\n let nextTrackedNode = insertAfter\n ? referenceNode.nextSibling\n : referenceNode;\n while (nextTrackedNode !== null) {\n const childFragment = Fragment.get(nextTrackedNode);\n if (childFragment !== null) {\n const childIndex = this.children.indexOf(childFragment);\n if (childIndex !== -1) {\n return {index: childIndex, referenceNode: insertionReferenceNode};\n }\n }\n nextTrackedNode = nextTrackedNode.nextSibling;\n }\n\n return {index: this.children.length, referenceNode: insertionReferenceNode};\n }\n\n /**\n * 子ノードを参照ノードの前に挿入します。\n * 参照ノードがnullの場合、親の最後に追加されます。\n *\n * @param newChild 新しい子ノード\n * @param referenceChild 参照ノード\n * @return 挿入のPromise\n */\n public insertBefore(\n newChild: Fragment,\n referenceChild: Fragment | null,\n referenceNodeOverride?: Node | null,\n ): Promise<void> {\n if (this.skipMutationNodes) {\n return Promise.resolve();\n }\n\n // 循環参照チェック\n if (newChild === this) {\n Log.error('[Haori]', 'Cannot insert element as child of itself');\n return Promise.reject(new Error('Self-insertion not allowed'));\n }\n\n // 祖先チェック\n const ancestors = new Set<Fragment>();\n let ancestor = this.parent;\n while (ancestor) {\n ancestors.add(ancestor);\n ancestor = ancestor.getParent();\n }\n if (ancestors.has(newChild)) {\n Log.error('[Haori]', 'Cannot create circular reference');\n return Promise.reject(new Error('Circular reference detected'));\n }\n\n // 同じ親内での移動かどうかを確認\n const isSameParent = newChild.getParent() === this;\n let newChildIndex = -1;\n let referenceIndex = -1;\n\n if (isSameParent) {\n newChildIndex = this.children.indexOf(newChild);\n if (referenceChild !== null) {\n referenceIndex = this.children.indexOf(referenceChild);\n }\n }\n\n const newChildParent = newChild.getParent();\n if (newChildParent !== null) {\n // 既存の親から削除\n newChildParent.removeChild(newChild);\n }\n\n let referenceNode: Node | null =\n referenceNodeOverride === undefined\n ? referenceChild?.getTarget() || null\n : referenceNodeOverride;\n\n if (referenceChild === null) {\n this.children.push(newChild);\n } else {\n let index: number;\n if (isSameParent) {\n // 同じ親内での移動の場合、削除後のインデックスを調整\n if (newChildIndex !== -1 && newChildIndex < referenceIndex) {\n // 削除する要素が参照要素より前にあった場合、インデックスは1つ減る\n index = referenceIndex - 1;\n } else {\n index = referenceIndex;\n }\n } else {\n index = this.children.indexOf(referenceChild);\n }\n\n if (index === -1) {\n const insertionPoint = this.resolveInsertionPointFromDom(\n referenceChild,\n false,\n );\n if (insertionPoint === null) {\n Log.warn(\n '[Haori]',\n 'Reference child not found in children.',\n referenceChild,\n );\n this.children.push(newChild);\n } else {\n this.children.splice(insertionPoint.index, 0, newChild);\n referenceNode = insertionPoint.referenceNode;\n }\n } else {\n this.children.splice(index, 0, newChild);\n }\n }\n\n newChild.setParent(this);\n newChild.setMounted(this.mounted);\n\n const prevSkip = this.skipMutationNodes;\n this.skipMutationNodes = true;\n return Queue.enqueue(() => {\n this.target.insertBefore(newChild.getTarget(), referenceNode);\n }).finally(() => {\n this.skipMutationNodes = prevSkip;\n }) as Promise<void>;\n }\n\n /**\n * 指定した参照ノードの後に子ノードを挿入します。\n *\n * @param newChild 子ノード\n * @param referenceChild 参照ノード\n * @returns 挿入のPromise\n */\n public insertAfter(\n newChild: Fragment,\n referenceChild: Fragment | null,\n ): Promise<void> {\n if (referenceChild == null) {\n return this.insertBefore(newChild, null);\n }\n const index = this.children.indexOf(referenceChild);\n if (index === -1) {\n const insertionPoint = this.resolveInsertionPointFromDom(\n referenceChild,\n true,\n );\n if (insertionPoint === null) {\n Log.warn(\n '[Haori]',\n 'Reference child not found in children.',\n referenceChild,\n );\n return this.insertBefore(newChild, null);\n }\n return this.insertBefore(\n newChild,\n this.children[insertionPoint.index] || null,\n insertionPoint.referenceNode,\n );\n }\n return this.insertBefore(newChild, this.children[index + 1] || null);\n }\n\n /**\n * 前のエレメントフラグメントを取得します。\n * 存在しない場合はnullを返します。\n *\n * @return 前のエレメントフラグメントまたはnull\n */\n public getPrevious(): ElementFragment | null {\n const parent = this.getParent();\n if (parent === null) {\n return null;\n }\n const siblings = parent.getChildElementFragments();\n const index = siblings.indexOf(this);\n if (index <= 0) {\n return null;\n }\n return siblings[index - 1];\n }\n\n /**\n * 次のエレメントフラグメントを取得します。\n * 存在しない場合はnullを返します。\n *\n * @return 次のエレメントフラグメントまたはnull\n */\n public getNext(): ElementFragment | null {\n const parent = this.getParent();\n if (parent === null) {\n return null;\n }\n const siblings = parent.getChildElementFragments();\n const index = siblings.indexOf(this);\n if (index < 0 || index + 1 >= siblings.length) {\n return null;\n }\n return siblings[index + 1];\n }\n\n /**\n * 表示状態を返します。\n *\n * @returns 表示状態\n */\n public isVisible(): boolean {\n return this.visible;\n }\n\n /**\n * エレメントを非表示にします。\n *\n * @returns エレメントの非表示のPromise\n */\n public hide(): Promise<void> {\n if (!this.visible) {\n return Promise.resolve();\n }\n this.visible = false;\n const target = this.getTarget();\n this.display = target.style.getPropertyValue('display');\n this.displayPriority = target.style.getPropertyPriority('display');\n target.style.setProperty('display', 'none', 'important');\n target.setAttribute(`${Env.prefix}if-false`, '');\n return Promise.resolve();\n }\n\n /**\n * エレメントを表示します。\n *\n * @return エレメントの表示のPromise\n */\n public show(): Promise<void> {\n if (this.visible) {\n return Promise.resolve();\n }\n const target = this.getTarget();\n if (this.display === null || this.display === '') {\n target.style.removeProperty('display');\n } else {\n target.style.setProperty(\n 'display',\n this.display,\n this.displayPriority ?? '',\n );\n }\n this.display = null;\n this.displayPriority = null;\n target.removeAttribute(`${Env.prefix}if-false`);\n this.visible = true;\n return Promise.resolve();\n }\n\n /**\n * 指定した属性名を持つ最も近い親要素を返します。\n * 見つからない場合はnullを返します。\n *\n * @param name 属性名\n * @returns 最も近い親要素またはnull\n */\n public closestByAttribute(name: string): ElementFragment | null {\n if (this.hasAttribute(name)) {\n return this;\n }\n const parent = this.getParent();\n if (parent === null) {\n return null;\n }\n return parent.closestByAttribute(name);\n }\n}\n\n/**\n * テキストフラグメント。\n * テキストノードを表現します。\n */\nexport class TextFragment extends Fragment {\n /** 未評価のテキスト文字列 */\n private text: string;\n\n /** コンテンツ */\n private contents: TextContents;\n\n /** 更新スキップフラグ(オブザーバーによる無限ループ対応) */\n private skipMutation = false;\n\n /** 直近に描画した文字列 */\n private renderedText: string | null = null;\n\n /**\n * テキストフラグメントのコンストラクタ。\n * 対象テキストノードの内容を初期化します。\n *\n * @param target 対象テキストノード\n */\n public constructor(target: Text) {\n super(target);\n this.text = target.textContent || '';\n this.contents = new TextContents(this.text);\n }\n\n /**\n * フラグメントをクローンします。\n *\n * @returns クローンされたフラグメント\n */\n public clone(): TextFragment {\n const clone = new TextFragment(this.target.cloneNode(true) as Text);\n clone.mounted = false;\n clone.text = this.text;\n clone.contents = this.contents;\n clone.renderedText = this.renderedText;\n return clone;\n }\n\n /**\n * フラグメントの対象ノードを取得します。\n *\n * @returns フラグメントの対象ノード\n */\n public getTarget(): Text {\n return this.target as Text;\n }\n\n /**\n * テキストに評価式が含まれているかどうかを返します。\n *\n * @returns 評価式を含むなら true\n */\n public hasDynamicContent(): boolean {\n return this.contents.isEvaluate || this.contents.isRawEvaluate;\n }\n\n /**\n * コンテンツを更新します。\n *\n * @param text テキスト\n * @returns 更新のPromise\n */\n public setContent(text: string): Promise<void> {\n if (this.skipMutation || this.text === text) {\n return Promise.resolve();\n }\n this.text = text;\n this.contents = new TextContents(text);\n return this.evaluate();\n }\n\n /**\n * フラグメントを評価します。\n *\n * @returns 評価結果のPromise\n */\n public evaluate(): Promise<void> {\n if (this.contents.isRawEvaluate && this.parent === null) {\n return Promise.reject(\n new Error('Parent fragment is required for raw evaluation'),\n );\n }\n return Queue.enqueue(() => {\n this.skipMutation = true;\n let nextText = this.text;\n if (this.contents.isRawEvaluate) {\n nextText = this.contents.evaluate(\n this.parent!.getBindingData(),\n {\n kind: 'text',\n element: this.parent!.getTarget(),\n childIndex: this.parent!.getChildren().indexOf(this),\n template: this.text,\n },\n )[0] as string;\n } else if (this.contents.isEvaluate) {\n nextText = TextContents.joinEvaluateResults(\n this.contents.evaluate(this.parent!.getBindingData(), {\n kind: 'text',\n element: this.parent!.getTarget(),\n childIndex: this.parent!.getChildren().indexOf(this),\n template: this.text,\n }),\n );\n }\n const currentText = this.contents.isRawEvaluate\n ? this.parent!.getTarget().innerHTML\n : this.target.textContent || '';\n if (this.renderedText === nextText && currentText === nextText) {\n return;\n }\n if (this.contents.isRawEvaluate) {\n this.parent!.getTarget().innerHTML = nextText;\n } else {\n this.target.textContent = nextText;\n }\n this.renderedText = nextText;\n }).finally(() => {\n this.skipMutation = false;\n }) as Promise<void>;\n }\n}\n\n/**\n * コメントフラグメント。\n * コメントノードを表現します。\n */\nexport class CommentFragment extends Fragment {\n /** コメント文字列 */\n private text: string;\n\n /** 更新スキップフラグ(オブザーバーによる無限ループ対応) */\n private skipMutation = false;\n\n /**\n * コメントフラグメントのコンストラクタ。\n * 対象コメントノードの内容を初期化します。\n *\n * @param target 対象コメントノード\n */\n public constructor(target: Comment) {\n super(target);\n this.text = target.textContent || '';\n }\n\n /**\n * フラグメントをクローンします。\n *\n * @returns クローンされたフラグメント\n */\n public clone(): Fragment {\n const clone = new CommentFragment(this.target.cloneNode(true) as Comment);\n clone.mounted = false;\n clone.text = this.text;\n return clone;\n }\n\n /**\n * フラグメントの対象ノードを取得します。\n *\n * @returns フラグメントの対象ノード\n */\n public getTarget(): Comment {\n return this.target as Comment;\n }\n\n /**\n * コンテンツを更新します。\n *\n * @param text テキスト\n * @return 更新のPromise\n */\n public setContent(text: string): Promise<void> {\n if (this.skipMutation || this.text === text) {\n return Promise.resolve();\n }\n this.text = text;\n return Queue.enqueue(() => {\n this.skipMutation = true;\n this.target.textContent = this.text;\n }).finally(() => {\n this.skipMutation = false;\n }) as Promise<void>;\n }\n}\n\n/**\n * 値の種別。\n */\nenum ExpressionType {\n /** テキスト */\n TEXT,\n\n /** 評価式 */\n EXPRESSION,\n\n /** 生の評価式 */\n RAW_EXPRESSION,\n}\n\n/**\n * コンテンツのインターフェース。\n */\ninterface Content {\n /** コンテンツの内容 */\n text: string;\n\n /** 値の種別 */\n type: ExpressionType;\n}\n\n/**\n * テキストコンテンツを管理するクラスです。\n * 一度生成されると内部は変更しません。\n */\nclass TextContents {\n /** プレースホルダ検出用の正規表現 */\n protected static readonly PLACEHOLDER_REGEX =\n /\\{\\{\\{([\\s\\S]+?)\\}\\}\\}|\\{\\{([\\s\\S]+?)\\}\\}/g;\n\n /**\n * 評価結果を結合して文字列にします。\n *\n * @param contents 評価結果の配列\n * @returns 結合された文字列\n */\n public static joinEvaluateResults(contents: unknown[] | null): string {\n if (contents === null || contents.length === 0) {\n return '';\n }\n return contents\n .map(c => {\n if (c === null || c === undefined || c === false || Number.isNaN(c)) {\n return '';\n } else if (typeof c !== 'string') {\n return String(c);\n } else {\n return c;\n }\n })\n .join('');\n }\n\n /** コンテンツのリスト */\n protected readonly contents: Content[] = [];\n\n /** 評価式が含まれるかどうか */\n public readonly isEvaluate: boolean = false;\n\n /** 生の評価式が含まれるかどうか */\n public readonly isRawEvaluate: boolean = false;\n\n /** 評価前の値 */\n private readonly value: string;\n\n /**\n * コンストラクタ。\n *\n * @param text テキスト\n */\n constructor(text: string) {\n this.value = text;\n\n const matches = [...text.matchAll(TextContents.PLACEHOLDER_REGEX)];\n let lastIndex = 0;\n\n let hasEvaluate = false;\n let hasRawEvaluate = false;\n for (const match of matches) {\n // プレースホルダ前の通常テキスト\n if (match.index > lastIndex) {\n this.contents.push({\n text: text.slice(lastIndex, match.index),\n type: ExpressionType.TEXT,\n });\n }\n // プレースホルダ本体\n const content = {\n text: match[1] ?? match[2],\n type: match[1]\n ? ExpressionType.RAW_EXPRESSION\n : ExpressionType.EXPRESSION,\n };\n hasEvaluate = true;\n hasRawEvaluate =\n hasRawEvaluate || content.type === ExpressionType.RAW_EXPRESSION;\n this.contents.push(content);\n lastIndex = match.index! + match[0].length;\n }\n // 最後のプレースホルダ以降の通常テキスト\n if (lastIndex < text.length) {\n this.contents.push({\n text: text.slice(lastIndex),\n type: ExpressionType.TEXT,\n });\n }\n this.isEvaluate = hasEvaluate;\n this.isRawEvaluate = hasRawEvaluate;\n this.checkRawExpressions();\n }\n\n /**\n * 評価前の値を取得します。\n *\n * @returns 評価前の値\n */\n public getValue(): string {\n return this.value;\n }\n\n /**\n * 単体プレースホルダのみで構成されているかどうかを返します。\n *\n * @returns 単体プレースホルダなら true\n */\n public isSingleExpression(): boolean {\n return (\n this.contents.length === 1 &&\n (this.contents[0].type === ExpressionType.EXPRESSION ||\n this.contents[0].type === ExpressionType.RAW_EXPRESSION)\n );\n }\n\n /**\n * RAW_EXPRESSION のチェックを行います。\n */\n protected checkRawExpressions(): void {\n for (let i = 0; i < this.contents.length; i++) {\n const content = this.contents[i];\n if (\n content.type === ExpressionType.RAW_EXPRESSION &&\n this.contents.length > 1\n ) {\n Log.error(\n '[Haori]',\n 'Raw expressions are not allowed in multi-content expressions.',\n );\n this.contents[i].type = ExpressionType.EXPRESSION;\n }\n }\n }\n\n /**\n * 式評価を行い、結果を返します。\n *\n * @param bindingValues バインディングされた値のオブジェクト\n * @returns 評価結果のリスト\n */\n public evaluate(\n bindingValues: Record<string, unknown>,\n profileContext?: EvaluationProfileContext,\n ): unknown[] {\n return this.evaluateDetailed(bindingValues, profileContext).results;\n }\n\n /**\n * 式評価を行い、未解決参照の有無を含む結果を返します。\n *\n * @param bindingValues バインディングされた値のオブジェクト\n * @returns 評価結果と未解決参照の有無\n */\n public evaluateDetailed(\n bindingValues: Record<string, unknown>,\n profileContext?: EvaluationProfileContext,\n ): {\n results: unknown[];\n hasUnresolvedReference: boolean;\n } {\n if (!this.isEvaluate && !this.isRawEvaluate) {\n return {\n results: this.contents.map(c => c.text),\n hasUnresolvedReference: false,\n };\n }\n return this.evaluateWithProfile(\n bindingValues,\n profileContext,\n content =>\n content.type === ExpressionType.EXPRESSION ||\n content.type === ExpressionType.RAW_EXPRESSION,\n 'text',\n );\n }\n\n /**\n * 式評価と profiler 記録をまとめて実行します。\n *\n * @param bindingValues バインディングされた値のオブジェクト\n * @param profileContext profiler 用コンテキスト\n * @param shouldEvaluate 評価対象判定\n * @param errorKind エラーログ種別\n * @returns 評価結果と未解決参照の有無\n */\n protected evaluateWithProfile(\n bindingValues: Record<string, unknown>,\n profileContext: EvaluationProfileContext | undefined,\n shouldEvaluate: (content: Content) => boolean,\n errorKind: 'text' | 'attribute',\n ): {\n results: unknown[];\n hasUnresolvedReference: boolean;\n } {\n const results: unknown[] = [];\n const profileExpressions: Array<{expression: string; durationMs: number}> =\n [];\n let totalDurationMs = 0;\n let hasUnresolvedReference = false;\n this.contents.forEach(content => {\n try {\n if (shouldEvaluate(content)) {\n const measured = EvaluationProfileRegistry.measure(() =>\n Expression.evaluateDetailed(content.text, bindingValues),\n );\n const result = measured.value;\n totalDurationMs += measured.durationMs;\n profileExpressions.push({\n expression: content.text,\n durationMs: measured.durationMs,\n });\n hasUnresolvedReference =\n hasUnresolvedReference || result.unresolvedReference;\n results.push(result.value);\n } else {\n results.push(content.text);\n }\n } catch (error) {\n Log.error(\n '[Haori]',\n `Error evaluating ${errorKind} expression: ${content.text}`,\n error,\n );\n profileExpressions.push({\n expression: content.text,\n durationMs: 0,\n });\n results.push('');\n }\n });\n EvaluationProfileRegistry.record(\n profileContext,\n profileExpressions,\n totalDurationMs,\n );\n return {results, hasUnresolvedReference};\n }\n}\n\n/**\n * 属性のコンテンツを管理するクラスです。\n * 一度生成されると内部は変更しません。\n */\nclass AttributeContents extends TextContents {\n /** 強制評価する属性名 */\n private static readonly FORCE_EVALUATION_ATTRIBUTES = [\n 'data-if',\n 'hor-if',\n 'data-each',\n 'hor-each',\n 'data-derive',\n 'hor-derive',\n ];\n\n /** 強制評価フラグ(プレースホルダでなくても評価する) */\n private readonly forceEvaluation: boolean;\n\n /**\n * コンストラクタ。\n *\n * @param name 属性名\n * @param text 属性値\n */\n constructor(name: string, value: string) {\n super(value);\n this.forceEvaluation =\n AttributeContents.FORCE_EVALUATION_ATTRIBUTES.includes(name);\n }\n\n /**\n * 強制評価フラグを取得します。\n *\n * @returns 強制評価フラグ\n */\n public isForceEvaluation(): boolean {\n return this.forceEvaluation;\n }\n\n /**\n * 式評価を行い、結果を返します。\n *\n * @param bindingValues バインディングされた値のオブジェクト\n * @returns 評価結果のリスト\n */\n public evaluate(\n bindingValues: Record<string, unknown>,\n profileContext?: EvaluationProfileContext,\n ): unknown[] {\n return this.evaluateDetailed(bindingValues, profileContext).results;\n }\n\n /**\n * 式評価を行い、未解決参照の有無を含む結果を返します。\n *\n * @param bindingValues バインディングされた値のオブジェクト\n * @returns 評価結果と未解決参照の有無\n */\n public evaluateDetailed(\n bindingValues: Record<string, unknown>,\n profileContext?: EvaluationProfileContext,\n ): {\n results: unknown[];\n hasUnresolvedReference: boolean;\n } {\n if (!this.isEvaluate && !this.forceEvaluation) {\n return {\n results: this.contents.map(c => c.text),\n hasUnresolvedReference: false,\n };\n }\n const detail = this.evaluateWithProfile(\n bindingValues,\n profileContext,\n content =>\n (this.forceEvaluation && content.type === ExpressionType.TEXT) ||\n content.type === ExpressionType.EXPRESSION ||\n content.type === ExpressionType.RAW_EXPRESSION,\n 'attribute',\n );\n if (this.forceEvaluation && detail.results.length > 1) {\n Log.error(\n '[Haori]',\n 'each or if expressions must have a single content.',\n detail.results,\n );\n return {\n results: [detail.results[0]],\n hasUnresolvedReference: detail.hasUnresolvedReference,\n };\n }\n return detail;\n }\n}\n","/**\n * @fileoverview Haoriイベント発火ユーティリティ\n *\n * Haoriライブラリが発火するカスタムイベントの統一的な発火機能を提供します。\n */\n\nimport type {HaoriRuntime} from './env';\n\n/**\n * Haoriイベントを発火するユーティリティクラス\n */\nexport interface FetchStartMetadata {\n /** 実行モード。 */\n runtime?: HaoriRuntime;\n /** 属性で指定された元の HTTP メソッド。 */\n requestedMethod?: string;\n /** 実際の通信に使う HTTP メソッド。 */\n effectiveMethod?: string;\n /** 通信方式。 */\n transportMode?: string;\n /** クエリ化後の検索文字列。 */\n queryString?: string;\n}\n\nexport default class HaoriEvent {\n /**\n * カスタムイベントを発火します。\n *\n * @param target イベントを発火する対象要素\n * @param eventName イベント名(haori:プレフィックスは自動追加)\n * @param detail イベントの詳細データ\n * @param options イベントオプション\n */\n public static dispatch(\n target: EventTarget,\n eventName: string,\n detail?: unknown,\n options?: {\n bubbles?: boolean;\n cancelable?: boolean;\n composed?: boolean;\n },\n ): boolean {\n const event = new CustomEvent(`haori:${eventName}`, {\n bubbles: options?.bubbles ?? true,\n cancelable: options?.cancelable ?? false,\n composed: options?.composed ?? true,\n detail,\n });\n\n return target.dispatchEvent(event);\n }\n\n /**\n * readyイベントを発火します。\n *\n * @param version ライブラリバージョン\n */\n public static ready(version?: string): void {\n HaoriEvent.dispatch(document, 'ready', {version});\n }\n\n /**\n * renderイベントを発火します。\n *\n * @param target 評価対象要素\n */\n public static render(target: HTMLElement): void {\n HaoriEvent.dispatch(target, 'render', {target});\n }\n\n /**\n * importstartイベントを発火します。\n *\n * @param target data-import要素\n * @param url インポート対象URL\n */\n public static importStart(target: HTMLElement, url: string): void {\n HaoriEvent.dispatch(target, 'importstart', {\n url,\n startedAt: performance.now(),\n });\n }\n\n /**\n * importendイベントを発火します。\n *\n * @param target data-import要素\n * @param url インポート対象URL\n * @param bytes 取得バイト数\n * @param startedAt 開始時刻\n */\n public static importEnd(\n target: HTMLElement,\n url: string,\n bytes: number,\n startedAt: number,\n ): void {\n HaoriEvent.dispatch(target, 'importend', {\n url,\n bytes,\n durationMs: performance.now() - startedAt,\n });\n }\n\n /**\n * importerrorイベントを発火します。\n *\n * @param target data-import要素\n * @param url インポート対象URL\n * @param error エラー内容\n */\n public static importError(\n target: HTMLElement,\n url: string,\n error: unknown,\n ): void {\n HaoriEvent.dispatch(target, 'importerror', {url, error});\n }\n\n /**\n * bindchangeイベントを発火します。\n *\n * @param target バインド対象要素\n * @param previous 変更前のデータ\n * @param next 変更後のデータ\n * @param reason 変更理由\n */\n public static bindChange(\n target: HTMLElement,\n previous: Record<string, unknown> | null,\n next: Record<string, unknown>,\n reason: 'form' | 'fetch' | 'manual' | 'import' | 'other' = 'other',\n ): void {\n const changedKeys: string[] = [];\n\n // 変更されたキーを検出\n const prevKeys = new Set(Object.keys(previous || {}));\n const nextKeys = new Set(Object.keys(next));\n const allKeys = new Set([...prevKeys, ...nextKeys]);\n\n for (const key of allKeys) {\n const prevValue = previous?.[key];\n const nextValue = next[key];\n if (prevValue !== nextValue) {\n changedKeys.push(key);\n }\n }\n\n HaoriEvent.dispatch(target, 'bindchange', {\n previous: previous || {},\n next,\n changedKeys,\n reason,\n });\n }\n\n /**\n * eachupdateイベントを発火します。\n *\n * @param target data-each要素\n * @param added 追加された行のキー\n * @param removed 削除された行のキー\n * @param order 現在の順序\n */\n public static eachUpdate(\n target: HTMLElement,\n added: string[],\n removed: string[],\n order: string[],\n ): void {\n HaoriEvent.dispatch(target, 'eachupdate', {\n added,\n removed,\n order,\n total: order.length,\n });\n }\n\n /**\n * rowaddイベントを発火します。\n *\n * @param target 行要素\n * @param key 行キー\n * @param index インデックス\n * @param item 行データ\n */\n public static rowAdd(\n target: HTMLElement,\n key: string,\n index: number,\n item: unknown,\n ): void {\n HaoriEvent.dispatch(target, 'rowadd', {key, index, item});\n }\n\n /**\n * rowremoveイベントを発火します。\n *\n * @param target 行要素\n * @param key 行キー\n * @param index インデックス\n */\n public static rowRemove(\n target: HTMLElement,\n key: string,\n index: number,\n ): void {\n HaoriEvent.dispatch(target, 'rowremove', {key, index});\n }\n\n /**\n * rowmoveイベントを発火します。\n *\n * @param target 行要素\n * @param key 行キー\n * @param from 移動前インデックス\n * @param to 移動後インデックス\n */\n public static rowMove(\n target: HTMLElement,\n key: string,\n from: number,\n to: number,\n ): void {\n HaoriEvent.dispatch(target, 'rowmove', {key, from, to});\n }\n\n /**\n * showイベントを発火します。\n *\n * @param target data-if要素\n */\n public static show(target: HTMLElement): void {\n HaoriEvent.dispatch(target, 'show', {visible: true});\n }\n\n /**\n * hideイベントを発火します。\n *\n * @param target data-if要素\n */\n public static hide(target: HTMLElement): void {\n HaoriEvent.dispatch(target, 'hide', {visible: false});\n }\n\n /**\n * fetchstartイベントを発火します。\n *\n * @param target 起点要素\n * @param url フェッチURL\n * @param options フェッチオプション\n * @param payload 送信データ\n * @param metadata runtime とメソッド変換情報。\n * @return 戻り値はありません。\n */\n public static fetchStart(\n target: HTMLElement,\n url: string,\n options?: RequestInit,\n payload?: Record<string, unknown>,\n metadata?: FetchStartMetadata,\n ): void {\n HaoriEvent.dispatch(target, 'fetchstart', {\n url,\n options: options || {},\n payload,\n startedAt: performance.now(),\n ...metadata,\n });\n }\n\n /**\n * fetchendイベントを発火します。\n *\n * @param target 起点要素\n * @param url フェッチURL\n * @param status HTTPステータス\n * @param startedAt 開始時刻\n */\n public static fetchEnd(\n target: HTMLElement,\n url: string,\n status: number,\n startedAt: number,\n ): void {\n HaoriEvent.dispatch(target, 'fetchend', {\n url,\n status,\n durationMs: performance.now() - startedAt,\n });\n }\n\n /**\n * fetcherrorイベントを発火します。\n *\n * @param target 起点要素\n * @param url フェッチURL\n * @param error エラー内容\n * @param status HTTPステータス(存在する場合)\n * @param startedAt 開始時刻(存在する場合)\n */\n public static fetchError(\n target: HTMLElement,\n url: string,\n error: unknown,\n status?: number,\n startedAt?: number,\n ): void {\n HaoriEvent.dispatch(target, 'fetcherror', {\n url,\n status,\n error,\n durationMs: startedAt ? performance.now() - startedAt : undefined,\n });\n }\n}\n","/**\n * @fileoverview 手続き的処理管理機能\n *\n * イベントに基づく手続き的な処理を提供します。\n */\n\nimport Core from './core';\nimport Env from './env';\nimport Expression from './expression';\nimport Form from './form';\nimport Fragment, {ElementFragment} from './fragment';\nimport Haori from './haori';\nimport Log from './log';\nimport HaoriEvent from './event';\n\ntype ProcedureHaoriApi = Pick<\n typeof Haori,\n | 'addErrorMessage'\n | 'closeDialog'\n | 'confirm'\n | 'dialog'\n | 'openDialog'\n | 'toast'\n>;\n\nconst PROCEDURE_HAORI_METHOD_NAMES = [\n 'addErrorMessage',\n 'closeDialog',\n 'confirm',\n 'dialog',\n 'openDialog',\n 'toast',\n] as const;\n\nconst PROCEDURE_HISTORY_STATE_KEY = '__haoriHistoryState__';\n\n/** click ロック中であることを示す内部マーカー属性名 */\nconst PROCEDURE_CLICK_LOCK_MARKER = 'data-haori-click-lock';\n\n/**\n * Procedure から利用する Haori API を解決します。\n * window.Haori が差し替えられている場合はそちらを優先します。\n *\n * @returns Procedure が使用する Haori API。\n */\nfunction resolveProcedureHaoriApi(): ProcedureHaoriApi {\n const scope = globalThis as typeof globalThis & {\n window?: Window & {Haori?: unknown};\n };\n const candidate = scope.window?.Haori;\n const hasRequiredMethods = PROCEDURE_HAORI_METHOD_NAMES.every(\n methodName =>\n typeof (candidate as Record<string, unknown> | undefined)?.[\n methodName\n ] === 'function',\n );\n return hasRequiredMethods ? (candidate as ProcedureHaoriApi) : Haori;\n}\n\nconst QUERY_TRANSPORT_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);\n\n/**\n * URL クエリ化の対象メソッドかどうかを判定します。\n *\n * @param method 判定対象の HTTP メソッド。\n * @return クエリ送信対象なら true。\n */\nfunction isQueryTransportMethod(method: string): boolean {\n return QUERY_TRANSPORT_METHODS.has(method.toUpperCase());\n}\n\n/**\n * 送信データを URLSearchParams に追加します。\n *\n * @param params 追加先の URLSearchParams。\n * @param payload 追加対象の送信データ。\n * @return 戻り値はありません。\n */\nfunction appendPayloadToSearchParams(\n params: URLSearchParams,\n payload: Record<string, unknown>,\n): void {\n for (const [key, value] of Object.entries(payload)) {\n if (value === undefined) {\n continue;\n }\n if (value === null) {\n params.append(key, '');\n } else if (Array.isArray(value)) {\n value.forEach(item => {\n params.append(key, String(item));\n });\n } else if (typeof value === 'object' || typeof value === 'function') {\n params.append(key, JSON.stringify(value));\n } else {\n params.append(key, String(value));\n }\n }\n}\n\n/**\n * 送信データをクエリ文字列へ付加した URL を返します。\n *\n * @param fetchUrl 元のフェッチ URL。\n * @param payload 追加対象の送信データ。\n * @return クエリ文字列を付加した URL。\n */\nfunction appendPayloadToUrl(\n fetchUrl: string,\n payload: Record<string, unknown>,\n): string {\n const url = new URL(fetchUrl, window.location.href);\n const params = new URLSearchParams(url.search);\n appendPayloadToSearchParams(params, payload);\n url.search = params.toString();\n return url.toString();\n}\n\n/**\n * 自動再評価用に解決したフェッチシグネチャです。\n */\nexport interface ResolvedFetchSignature {\n /** 比較用シグネチャ。無効な場合は null */\n signature: string | null;\n\n /** 未解決参照が含まれていたかどうか */\n hasUnresolvedReference: boolean;\n}\n\ninterface ResolvedDataAttribute {\n value: Record<string, unknown> | null;\n hasUnresolvedReference: boolean;\n}\n\ninterface PreparedFetchRequest {\n url: string | null;\n options: RequestInit | null;\n payload: Record<string, unknown>;\n hasUnresolvedReference: boolean;\n requestedMethod: string;\n effectiveMethod: string;\n queryString?: string;\n transportMode: 'http' | 'query-get';\n signature: string | null;\n}\n\ninterface PayloadResolution {\n payload: Record<string, unknown>;\n hasUnresolvedReference: boolean;\n}\n\nfunction normalizeRequestBody(body: BodyInit | null | undefined): unknown {\n if (body === undefined || body === null) {\n return null;\n }\n if (typeof body === 'string') {\n return body;\n }\n if (body instanceof URLSearchParams) {\n return body.toString();\n }\n if (body instanceof FormData) {\n return Array.from(body.entries()).map(([key, value]) => {\n if (value instanceof File) {\n return [\n key,\n {\n type: 'file',\n name: value.name,\n size: value.size,\n mimeType: value.type,\n },\n ];\n }\n return [key, String(value)];\n });\n }\n return String(body);\n}\n\nfunction buildFetchSignature(url: string, options: RequestInit): string {\n const headers = new Headers(\n (options.headers as HeadersInit | undefined) || undefined,\n );\n const normalizedHeaders = Array.from(headers.entries()).sort(([a], [b]) =>\n a.localeCompare(b),\n );\n return JSON.stringify({\n url,\n method: String(options.method || 'GET').toUpperCase(),\n headers: normalizedHeaders,\n body: normalizeRequestBody((options.body as BodyInit | undefined) || null),\n });\n}\n\n/**\n * フェッチ前実行スクリプト戻り値型。\n */\nexport interface BeforeCallbackResult {\n /** 処理を停止する場合は true */\n stop?: boolean;\n\n /** 上書きするフェッチURL */\n fetchUrl?: string | null;\n\n /** 上書きするフェッチオプション */\n fetchOptions?: RequestInit | null;\n}\n\n/**\n * フェッチ後実行スクリプト戻り値型。\n */\nexport interface AfterCallbackResult {\n /** 処理を停止する場合は true */\n stop?: boolean;\n\n /** レスポンスとして使用するデータ */\n response?: Response;\n}\n\n/**\n * Procedureクラスのオプションインターフェース。\n */\nexport interface ProcedureOptions {\n /** 処理対象のフラグメント */\n targetFragment?: ElementFragment;\n\n /** バリデーションを行うかどうか */\n valid?: boolean;\n\n /** 確認メッセージ */\n confirmMessage?: string | null;\n\n /** 送信もしくは受信データ */\n data?: Record<string, unknown> | null;\n\n /** data 属性の評価元となる属性名 */\n dataAttrName?: string | null;\n\n /** フェッチ前実行スクリプト */\n beforeCallback?: (\n fetchUrl: string | null,\n fetchOptions: RequestInit | null,\n ) => BeforeCallbackResult | boolean | void;\n\n /** 対象フォームフラグメント */\n formFragment?: ElementFragment | null;\n\n /** フェッチURL */\n fetchUrl?: string | null;\n\n /** フェッチ関連属性に未解決参照が含まれていたかどうか */\n fetchHasUnresolvedReference?: boolean | null;\n\n /** フェッチオプション */\n fetchOptions?: RequestInit | null;\n\n /** バインド対象フラグメント */\n bindFragments?: ElementFragment[] | null;\n\n /** レスポンスデータから抽出するパラメータ名のリスト */\n bindParams?: string[] | null;\n\n /** レスポンスデータのうち既存配列へ追記するパラメータ名のリスト */\n bindAppendParams?: string[] | null;\n\n /** レスポンスデータをバインドする際のキー名 */\n bindArg?: string | null;\n\n /** フェッチ後実行スクリプト */\n afterCallback?: (\n response: Response | Record<string, unknown>,\n ) => AfterCallbackResult | boolean | void;\n\n /** 値を変更するフラグメント */\n adjustFragments?: ElementFragment[] | null;\n\n /** 変更する値の増減値 */\n adjustValue?: number | null;\n\n /** 行追加の有無 */\n rowAdd?: boolean | null;\n\n /** 行削除の有無 */\n rowRemove?: boolean | null;\n\n /** 前の行へ移動するかどうか */\n rowMovePrev?: boolean | null;\n\n /** 次の行へ移動するかどうか */\n rowMoveNext?: boolean | null;\n\n /** 送信前にリセットするフラグメント */\n resetBeforeFragments?: ElementFragment[] | null;\n\n /** リセットするフラグメント */\n resetFragments?: ElementFragment[] | null;\n\n /** 再フェッチするフラグメント */\n refetchFragments?: ElementFragment[] | null;\n\n /** クリックするフラグメント */\n clickFragments?: ElementFragment[] | null;\n\n /** ダイアログを開くフラグメント */\n openFragments?: ElementFragment[] | null;\n\n /** ダイアログを閉じるフラグメント */\n closeFragments?: ElementFragment[] | null;\n\n /** コピー先フラグメント */\n copyFragments?: ElementFragment[] | null;\n\n /** コピー対象パラメータ名のリスト */\n copyParams?: string[] | null;\n\n /** ダイアログメッセージ */\n dialogMessage?: string | null;\n\n /** トーストメッセージ */\n toastMessage?: string | null;\n\n /** トーストレベル */\n toastLevel?: 'info' | 'warning' | 'error' | 'success' | null;\n\n /** history.pushState で追加する URL */\n historyUrl?: string | null;\n\n /** history.pushState の URL に追記するクエリパラメータ */\n historyData?: Record<string, unknown> | null;\n\n /** history.pushState の URL に追記するクエリパラメータの評価元属性名 */\n historyDataAttrName?: string | null;\n\n /** reset-before 後に確定した historyData のスナップショット */\n historyDataSnapshot?: Record<string, unknown> | null;\n\n /** history.pushState の URL に追記するフォームフラグメント */\n historyFormFragment?: ElementFragment | null;\n\n /** reset-before 後に確定した historyForm のスナップショット */\n historyFormSnapshot?: Record<string, unknown> | null;\n\n /** リダイレクトURL */\n redirectUrl?: string | null;\n\n /** エラー時に最初のエラー要素へスクロールするかどうか */\n scrollOnError?: boolean | null;\n\n /** 成功時にスクロールする要素のCSSセレクター */\n scrollTarget?: string | null;\n}\n\ninterface ExecutionLockState {\n /** 実行中として扱う対象要素 */\n target: HTMLElement;\n\n /** 今回の処理で disabled 属性を付与したかどうか */\n appliedDisabledAttribute: boolean;\n}\n\n/**\n * 手続き的処理管理クラスです。\n */\nexport default class Procedure {\n /** data 属性内のテンプレート式検出用正規表現 */\n private static readonly DATA_PLACEHOLDER_REGEX =\n /\\{\\{\\{([\\s\\S]+?)\\}\\}\\}|\\{\\{([\\s\\S]+?)\\}\\}/g;\n\n /** 属性全体が単一テンプレート式かを判定する正規表現 */\n private static readonly SINGLE_PLACEHOLDER_REGEX =\n /^(\\{\\{\\{[\\s\\S]+?\\}\\}\\}|\\{\\{[\\s\\S]+?\\}\\})$/;\n\n /** click 手続きの再入を防ぐ対象要素の集合 */\n private static readonly RUNNING_CLICK_TARGETS = new WeakSet<HTMLElement>();\n\n /** この Procedure が扱うイベント種別 */\n private readonly eventType: string | null;\n\n /**\n * イベント属性名を正しく生成します。\n * 例: (\"click\", \"fetch\") => \"data-click-fetch\"\n * (null, \"fetch\") => \"data-fetch\"\n * (\"change\", \"bind-arg\") => \"data-change-bind-arg\"\n * 非イベント変種が \"data-fetch-xxx\" として存在するものについては、event が null の場合にそちらを返します。\n */\n private static attrName(\n event: string | null,\n key: string,\n hasFetchFallback: boolean = false,\n ): string {\n if (event) {\n return `${Env.prefix}${event}-${key}`;\n }\n return hasFetchFallback\n ? `${Env.prefix}fetch-${key}`\n : `${Env.prefix}${key}`;\n }\n\n /**\n * data 属性のテンプレート式評価結果を URLSearchParams 向けに組み立てます。\n *\n * @param rawAttribute 生の属性値\n * @param bindingValues バインディング値\n * @returns パラメータ形式として扱える文字列\n */\n private static resolveDataParamString(\n rawAttribute: string,\n bindingValues: Record<string, unknown>,\n ): string {\n return Procedure.resolveDataParamStringDetailed(rawAttribute, bindingValues)\n .value;\n }\n\n /**\n * data 属性のテンプレート式評価結果を URLSearchParams 向けに組み立てます。\n *\n * @param rawAttribute 生の属性値\n * @param bindingValues バインディング値\n * @returns パラメータ形式として扱える文字列と未解決参照の有無\n */\n private static resolveDataParamStringDetailed(\n rawAttribute: string,\n bindingValues: Record<string, unknown>,\n ): {value: string; hasUnresolvedReference: boolean} {\n let hasUnresolvedReference = false;\n const value = rawAttribute.replace(\n Procedure.DATA_PLACEHOLDER_REGEX,\n (\n _matched: string,\n rawExpression: string | undefined,\n expression: string | undefined,\n ): string => {\n const result = Expression.evaluateDetailed(\n rawExpression ?? expression ?? '',\n bindingValues,\n );\n hasUnresolvedReference =\n hasUnresolvedReference || result.unresolvedReference;\n if (\n result.value === null ||\n result.value === undefined ||\n Number.isNaN(result.value)\n ) {\n return '';\n }\n if (typeof result.value === 'object') {\n return encodeURIComponent(JSON.stringify(result.value));\n }\n return encodeURIComponent(String(result.value));\n },\n );\n return {value, hasUnresolvedReference};\n }\n\n /**\n * JSON 文字列中のテンプレート式かどうかを判定します。\n *\n * @param source 生の属性値\n * @param offset プレースホルダ開始位置\n * @returns JSON 文字列中なら true\n */\n private static isJsonStringContext(source: string, offset: number): boolean {\n let inString = false;\n let escaped = false;\n for (let index = 0; index < offset; index += 1) {\n const char = source[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (char === '\\\\') {\n escaped = true;\n continue;\n }\n if (char === '\"') {\n inString = !inString;\n }\n }\n return inString;\n }\n\n /**\n * JSON 値コンテキスト向けにテンプレート式の評価結果を直列化します。\n *\n * @param result テンプレート式の評価結果\n * @returns JSON 値として埋め込める文字列\n */\n private static stringifyJsonTemplateValue(result: unknown): string {\n if (result === undefined || Number.isNaN(result)) {\n return 'null';\n }\n try {\n const serialized = JSON.stringify(result);\n return serialized ?? JSON.stringify(String(result));\n } catch {\n return JSON.stringify(String(result));\n }\n }\n\n /**\n * JSON 文字列コンテキスト向けにテンプレート式の評価結果を直列化します。\n *\n * @param result テンプレート式の評価結果\n * @returns JSON 文字列へ安全に埋め込める文字列\n */\n private static stringifyJsonTemplateStringContent(result: unknown): string {\n if (result === null || result === undefined || Number.isNaN(result)) {\n return '';\n }\n const value =\n typeof result === 'object'\n ? Procedure.stringifyJsonTemplateValue(result)\n : String(result);\n return JSON.stringify(value).slice(1, -1);\n }\n\n /**\n * JSON 形式 data 属性内のテンプレート式を安全に解決します。\n *\n * @param rawAttribute 生の属性値\n * @param bindingValues バインディング値\n * @returns JSON として解釈可能な文字列\n */\n private static resolveDataJsonString(\n rawAttribute: string,\n bindingValues: Record<string, unknown>,\n ): string {\n return Procedure.resolveDataJsonStringDetailed(rawAttribute, bindingValues)\n .value;\n }\n\n /**\n * JSON 形式 data 属性内のテンプレート式を安全に解決します。\n *\n * @param rawAttribute 生の属性値\n * @param bindingValues バインディング値\n * @returns JSON として解釈可能な文字列と未解決参照の有無\n */\n private static resolveDataJsonStringDetailed(\n rawAttribute: string,\n bindingValues: Record<string, unknown>,\n ): {value: string; hasUnresolvedReference: boolean} {\n let hasUnresolvedReference = false;\n const value = rawAttribute.replace(\n Procedure.DATA_PLACEHOLDER_REGEX,\n (\n _matched: string,\n rawExpression: string | undefined,\n expression: string | undefined,\n offset: number,\n ): string => {\n const result = Expression.evaluateDetailed(\n rawExpression ?? expression ?? '',\n bindingValues,\n );\n hasUnresolvedReference =\n hasUnresolvedReference || result.unresolvedReference;\n return Procedure.isJsonStringContext(rawAttribute, offset)\n ? Procedure.stringifyJsonTemplateStringContent(result.value)\n : Procedure.stringifyJsonTemplateValue(result.value);\n },\n );\n return {value, hasUnresolvedReference};\n }\n\n /**\n * data 属性を評価済みの値として取得します。\n *\n * @param fragment フラグメント\n * @param attrName 属性名\n * @returns 送信データ\n */\n private static resolveDataAttribute(\n fragment: ElementFragment,\n attrName: string,\n ): Record<string, unknown> | null {\n return Procedure.resolveDataAttributeDetailed(fragment, attrName).value;\n }\n\n /**\n * data 属性を評価済みの値として取得し、未解決参照の有無を返します。\n *\n * @param fragment フラグメント\n * @param attrName 属性名\n * @returns 送信データと未解決参照の有無\n */\n private static resolveDataAttributeDetailed(\n fragment: ElementFragment,\n attrName: string,\n ): ResolvedDataAttribute {\n const rawAttribute = fragment.getRawAttribute(attrName);\n const attributeEvaluation = fragment.getAttributeEvaluation(attrName);\n const dataAttribute = attributeEvaluation?.value ?? null;\n const hasUnresolvedReference =\n attributeEvaluation?.hasUnresolvedReference ?? false;\n if (\n dataAttribute &&\n typeof dataAttribute === 'object' &&\n !Array.isArray(dataAttribute)\n ) {\n return {\n value: dataAttribute as Record<string, unknown>,\n hasUnresolvedReference,\n };\n }\n if (typeof dataAttribute !== 'string' || rawAttribute === null) {\n return {value: null, hasUnresolvedReference};\n }\n const trimmed = rawAttribute.trim();\n if (Procedure.SINGLE_PLACEHOLDER_REGEX.test(trimmed)) {\n return {\n value: Core.parseDataBind(dataAttribute),\n hasUnresolvedReference,\n };\n }\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n const resolved = Procedure.resolveDataJsonStringDetailed(\n rawAttribute,\n fragment.getBindingData(),\n );\n return {\n value: Core.parseDataBind(resolved.value),\n hasUnresolvedReference:\n hasUnresolvedReference || resolved.hasUnresolvedReference,\n };\n }\n const resolved = Procedure.resolveDataParamStringDetailed(\n rawAttribute,\n fragment.getBindingData(),\n );\n return {\n value: Core.parseDataBind(resolved.value),\n hasUnresolvedReference:\n hasUnresolvedReference || resolved.hasUnresolvedReference,\n };\n }\n\n /**\n * オプションをフラグメントの属性から構築します。\n *\n * @param fragment フラグメント\n * @param event イベント名\n * @return 構築されたオプション\n */\n private static buildOptions(\n fragment: ElementFragment,\n event: string | null,\n ): ProcedureOptions {\n const options: ProcedureOptions = {\n targetFragment: fragment,\n };\n if (event) {\n // validate(spec: data-???-validate)\n if (fragment.hasAttribute(Procedure.attrName(event, 'validate'))) {\n options.valid = true;\n }\n // confirm\n if (fragment.hasAttribute(Procedure.attrName(event, 'confirm'))) {\n options.confirmMessage = (\n fragment.getAttribute(Procedure.attrName(event, 'confirm')) as string\n ).replace(/\\\\n/g, '\\n');\n }\n // data(イベント)\n if (fragment.hasAttribute(Procedure.attrName(event, 'data'))) {\n options.dataAttrName = Procedure.attrName(event, 'data');\n }\n // form(イベント)\n if (fragment.hasAttribute(Procedure.attrName(event, 'form'))) {\n const formSelector = fragment.getRawAttribute(\n Procedure.attrName(event, 'form'),\n ) as string | null;\n if (formSelector) {\n const formElement = document.body.querySelector(formSelector);\n if (formElement !== null) {\n options.formFragment = Form.getFormFragment(\n Fragment.get(formElement) as ElementFragment,\n );\n } else {\n Log.error(\n 'Haori',\n `Form element not found: ${formSelector}` +\n ` (${Procedure.attrName(event, 'form')})`,\n );\n }\n } else {\n // 属性はあるが値が省略された場合は自要素もしくは先祖の form を対象\n options.formFragment = Form.getFormFragment(fragment);\n }\n } else if (event === 'change') {\n // changeイベントの場合、data-change-form属性がなくても自動的にフォームを検索\n options.formFragment = Form.getFormFragment(fragment);\n }\n if (fragment.hasAttribute(`${Env.prefix}${event}-before-run`)) {\n const body = fragment.getRawAttribute(\n `${Env.prefix}${event}-before-run`,\n ) as string;\n try {\n options.beforeCallback = new Function(\n 'fetchUrl',\n 'fetchOptions',\n `\n\"use strict\";\n${body}\n`,\n ) as (\n fetchUrl: string | null,\n fetchOptions: RequestInit | null,\n ) => BeforeCallbackResult | boolean | void;\n } catch (e) {\n Log.error('Haori', `Invalid before script: ${e}`);\n }\n }\n }\n // fetch URL(イベントあり/なし)\n const fetchAttrName = Procedure.attrName(event, 'fetch');\n const hasFetchAttr = fragment.hasAttribute(fetchAttrName);\n if (hasFetchAttr) {\n const fetchEvaluation = fragment.getAttributeEvaluation(fetchAttrName);\n if (fetchEvaluation) {\n options.fetchHasUnresolvedReference =\n fetchEvaluation.hasUnresolvedReference;\n options.fetchUrl = fetchEvaluation.hasUnresolvedReference\n ? null\n : (fetchEvaluation.value as string | null);\n }\n }\n const fetchOptions: RequestInit = {};\n // fetch-method(イベントあり/なし)\n // event: data-{event}-fetch-method, non-event: data-fetch-method\n if (event) {\n const fetchMethodAttrEvent = Procedure.attrName(event, 'fetch-method');\n if (fragment.hasAttribute(fetchMethodAttrEvent)) {\n const fetchMethodEvaluation =\n fragment.getAttributeEvaluation(fetchMethodAttrEvent);\n if (fetchMethodEvaluation?.hasUnresolvedReference) {\n options.fetchHasUnresolvedReference = true;\n } else {\n fetchOptions.method = fetchMethodEvaluation?.value as string;\n }\n }\n } else {\n const fetchMethodAttrNonEvent = Procedure.attrName(null, 'method', true);\n if (fragment.hasAttribute(fetchMethodAttrNonEvent)) {\n const fetchMethodEvaluation = fragment.getAttributeEvaluation(\n fetchMethodAttrNonEvent,\n );\n if (fetchMethodEvaluation?.hasUnresolvedReference) {\n options.fetchHasUnresolvedReference = true;\n } else {\n fetchOptions.method = fetchMethodEvaluation?.value as string;\n }\n }\n }\n // fetch-headers(イベントあり/なし)\n // event: data-{event}-fetch-headers, non-event: data-fetch-headers\n if (event) {\n const fetchHeadersAttrEvent = Procedure.attrName(event, 'fetch-headers');\n if (fragment.hasAttribute(fetchHeadersAttrEvent)) {\n const headersString = fragment.getRawAttribute(\n fetchHeadersAttrEvent,\n ) as string;\n try {\n fetchOptions.headers = Core.parseDataBind(headersString) as Record<\n string,\n string\n >;\n } catch (e) {\n Log.error('Haori', `Invalid fetch headers: ${e}`);\n }\n }\n } else {\n const fetchHeadersAttrNonEvent = Procedure.attrName(\n null,\n 'headers',\n true,\n );\n if (fragment.hasAttribute(fetchHeadersAttrNonEvent)) {\n const headersString = fragment.getRawAttribute(\n fetchHeadersAttrNonEvent,\n ) as string;\n try {\n fetchOptions.headers = Core.parseDataBind(headersString) as Record<\n string,\n string\n >;\n } catch (e) {\n Log.error('Haori', `Invalid fetch headers: ${e}`);\n }\n }\n }\n // fetch-content-type(イベントあり/なし)\n // event: data-{event}-fetch-content-type\n // non-event: data-fetch-content-type\n if (event) {\n const fetchCTAttrEvent = Procedure.attrName(event, 'fetch-content-type');\n if (fragment.hasAttribute(fetchCTAttrEvent)) {\n const fetchContentTypeEvaluation =\n fragment.getAttributeEvaluation(fetchCTAttrEvent);\n if (fetchContentTypeEvaluation?.hasUnresolvedReference) {\n options.fetchHasUnresolvedReference = true;\n }\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': fetchContentTypeEvaluation?.value as string,\n };\n } else if (\n fetchOptions.method &&\n fetchOptions.method !== 'GET' &&\n fetchOptions.method !== 'HEAD' &&\n fetchOptions.method !== 'OPTIONS'\n ) {\n // only set default Content-Type when one is not already provided\n let hasContentType = false;\n if (fetchOptions.headers && typeof fetchOptions.headers === 'object') {\n const headersObj = fetchOptions.headers as Record<string, unknown>;\n hasContentType = 'Content-Type' in headersObj;\n }\n if (!hasContentType) {\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': 'application/json',\n };\n }\n } else if (\n fetchOptions.method &&\n (fetchOptions.method === 'GET' ||\n fetchOptions.method === 'HEAD' ||\n fetchOptions.method === 'OPTIONS')\n ) {\n // 仕様: GET/HEAD/OPTIONS 既定は application/x-www-form-urlencoded\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': 'application/x-www-form-urlencoded',\n };\n }\n } else {\n const fetchCTAttrNonEvent = Procedure.attrName(\n null,\n 'content-type',\n true,\n );\n if (fragment.hasAttribute(fetchCTAttrNonEvent)) {\n const fetchContentTypeEvaluation =\n fragment.getAttributeEvaluation(fetchCTAttrNonEvent);\n if (fetchContentTypeEvaluation?.hasUnresolvedReference) {\n options.fetchHasUnresolvedReference = true;\n }\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': fetchContentTypeEvaluation?.value as string,\n };\n } else if (\n fetchOptions.method &&\n fetchOptions.method !== 'GET' &&\n fetchOptions.method !== 'HEAD' &&\n fetchOptions.method !== 'OPTIONS'\n ) {\n // only set default Content-Type when one is not already provided\n let hasContentType = false;\n if (fetchOptions.headers && typeof fetchOptions.headers === 'object') {\n const headersObj = fetchOptions.headers as Record<string, unknown>;\n hasContentType = 'Content-Type' in headersObj;\n }\n if (!hasContentType) {\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': 'application/json',\n };\n }\n } else if (\n fetchOptions.method &&\n (fetchOptions.method === 'GET' ||\n fetchOptions.method === 'HEAD' ||\n fetchOptions.method === 'OPTIONS')\n ) {\n // 仕様: GET/HEAD/OPTIONS 既定は application/x-www-form-urlencoded\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': 'application/x-www-form-urlencoded',\n };\n }\n }\n if (Object.keys(fetchOptions).length > 0) {\n options.fetchOptions = fetchOptions;\n }\n // bind(イベントあり/なし: 非イベントは data-fetch-bind)\n const bindAttr = event\n ? Procedure.attrName(event, 'bind')\n : Procedure.attrName(null, 'bind', true);\n if (fragment.hasAttribute(bindAttr)) {\n const bindSelector = fragment.getRawAttribute(bindAttr) as string | null;\n if (bindSelector) {\n const bindElements = document.body.querySelectorAll(bindSelector);\n if (bindElements.length > 0) {\n options.bindFragments = [];\n bindElements.forEach(element => {\n const fragment = Fragment.get(element);\n if (fragment) {\n options.bindFragments!.push(fragment as ElementFragment);\n }\n });\n } else {\n Log.error(\n 'Haori',\n `Bind element not found: ${bindSelector} (${bindAttr})`,\n );\n }\n }\n }\n const bindArgAttrEvent = Procedure.attrName(event, 'bind-arg');\n const bindArgAttrNonEventLegacy = Procedure.attrName(\n null,\n 'arg',\n true,\n ); // data-fetch-arg\n const bindArgAttrNonEventNew = Procedure.attrName(\n null,\n 'bind-arg',\n true,\n ); // data-fetch-bind-arg (less common)\n if (event) {\n if (fragment.hasAttribute(bindArgAttrEvent)) {\n options.bindArg = fragment.getRawAttribute(bindArgAttrEvent) as\n | string\n | null;\n }\n } else {\n // Prefer legacy `data-fetch-arg` for non-event usage.\n // Fallback to `data-fetch-bind-arg` if legacy is not present.\n if (fragment.hasAttribute(bindArgAttrNonEventLegacy)) {\n options.bindArg = fragment.getRawAttribute(\n bindArgAttrNonEventLegacy,\n ) as string | null;\n } else if (fragment.hasAttribute(bindArgAttrNonEventNew)) {\n options.bindArg = fragment.getRawAttribute(bindArgAttrNonEventNew) as\n | string\n | null;\n }\n }\n const bindParamsAttr = event\n ? Procedure.attrName(event, 'bind-params')\n : Procedure.attrName(null, 'bind-params', true);\n if (fragment.hasAttribute(bindParamsAttr)) {\n const paramsString = fragment.getRawAttribute(bindParamsAttr) as string;\n options.bindParams = paramsString.split('&').map(p => p.trim());\n }\n const bindAppendAttr = event\n ? Procedure.attrName(event, 'bind-append')\n : Procedure.attrName(null, 'bind-append', true);\n if (fragment.hasAttribute(bindAppendAttr)) {\n const paramsString = fragment.getRawAttribute(bindAppendAttr) as string;\n options.bindAppendParams = paramsString\n .split('&')\n .map(p => p.trim())\n .filter(Boolean);\n }\n const copyParamsAttr = event\n ? Procedure.attrName(event, 'copy-params')\n : null;\n if (copyParamsAttr && fragment.hasAttribute(copyParamsAttr)) {\n const paramsString = fragment.getRawAttribute(copyParamsAttr) as string;\n options.copyParams = paramsString\n .split('&')\n .map(param => param.trim())\n .filter(Boolean);\n }\n if (event) {\n if (fragment.hasAttribute(Procedure.attrName(event, 'adjust'))) {\n const adjustSelector = fragment.getRawAttribute(\n Procedure.attrName(event, 'adjust'),\n ) as string | null;\n if (adjustSelector) {\n const adjustElements = document.body.querySelectorAll(adjustSelector);\n if (adjustElements.length > 0) {\n options.adjustFragments = [];\n adjustElements.forEach(element => {\n const fragment = Fragment.get(element);\n if (fragment) {\n options.adjustFragments!.push(fragment as ElementFragment);\n }\n });\n } else {\n Log.error(\n 'Haori',\n `Adjust element not found: ${adjustSelector}` +\n ` (${Procedure.attrName(event, 'adjust')})`,\n );\n }\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'adjust-value'))) {\n const valueString = fragment.getRawAttribute(\n Procedure.attrName(event, 'adjust-value'),\n ) as string;\n const value = Number(valueString);\n if (!isNaN(value)) {\n options.adjustValue = value;\n }\n }\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'row-add'))) {\n options.rowAdd = true;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'row-remove'))) {\n options.rowRemove = true;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'row-prev'))) {\n options.rowMovePrev = true;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'row-next'))) {\n options.rowMoveNext = true;\n }\n if (fragment.hasAttribute(`${Env.prefix}${event}-after-run`)) {\n const body = fragment.getRawAttribute(\n `${Env.prefix}${event}-after-run`,\n ) as string;\n try {\n options.afterCallback = new Function(\n 'response',\n `\n\"use strict\";\n${body}\n`,\n ) as (\n response: Response | Record<string, unknown>,\n ) => AfterCallbackResult | boolean | void;\n } catch (e) {\n Log.error('Haori', `Invalid after script: ${e}`);\n }\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'dialog'))) {\n options.dialogMessage = (\n fragment.getAttribute(Procedure.attrName(event, 'dialog')) as string\n ).replace(/\\\\n/g, '\\n');\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'toast'))) {\n options.toastMessage = fragment.getAttribute(\n Procedure.attrName(event, 'toast'),\n ) as string;\n const rawLevel = fragment.getRawAttribute(\n Procedure.attrName(event, 'toast-level'),\n );\n const validLevels = ['info', 'warning', 'error', 'success'] as const;\n type ToastLevel = (typeof validLevels)[number];\n const isValidLevel = validLevels.includes(rawLevel as ToastLevel);\n options.toastLevel = isValidLevel ? (rawLevel as ToastLevel) : null;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'redirect'))) {\n options.redirectUrl = fragment.getAttribute(\n Procedure.attrName(event, 'redirect'),\n ) as string;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'scroll-error'))) {\n options.scrollOnError = true;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'scroll'))) {\n options.scrollTarget = fragment.getAttribute(\n Procedure.attrName(event, 'scroll'),\n ) as string;\n }\n // history(data-{event}-history / history-data / history-form)\n if (fragment.hasAttribute(Procedure.attrName(event, 'history'))) {\n options.historyUrl = fragment.getAttribute(\n Procedure.attrName(event, 'history'),\n ) as string | null;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'history-data'))) {\n options.historyDataAttrName = Procedure.attrName(event, 'history-data');\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'history-form'))) {\n const historyFormSelector = fragment.getRawAttribute(\n Procedure.attrName(event, 'history-form'),\n ) as string | null;\n if (historyFormSelector) {\n const historyFormElement =\n document.body.querySelector(historyFormSelector);\n if (historyFormElement !== null) {\n options.historyFormFragment = Form.getFormFragment(\n Fragment.get(historyFormElement) as ElementFragment,\n );\n } else {\n Log.error(\n 'Haori',\n `Form element not found: ${historyFormSelector}` +\n ` (${Procedure.attrName(event, 'history-form')})`,\n );\n }\n } else {\n options.historyFormFragment = Form.getFormFragment(fragment);\n }\n }\n\n // reset/refetch/click/open/close(イベント、CSSセレクタ)\n const selectorAttrs = [\n 'reset-before',\n 'reset',\n 'refetch',\n 'click',\n 'copy',\n 'open',\n 'close',\n ] as const;\n selectorAttrs.forEach(attrKey => {\n const attrName = Procedure.attrName(event, attrKey);\n if (!fragment.hasAttribute(attrName)) {\n return;\n }\n const selector = fragment.getRawAttribute(attrName) as string | null;\n const list: ElementFragment[] = [];\n if (selector) {\n const elements = document.body.querySelectorAll(selector);\n elements.forEach(el => {\n const frag = Fragment.get(el);\n if (frag) {\n list.push(frag as ElementFragment);\n }\n });\n if (list.length === 0) {\n Log.error('Haori', `Element not found: ${selector} (${attrName})`);\n }\n } else {\n // 値が省略されている場合は自要素を対象\n list.push(fragment);\n }\n if (list.length > 0) {\n switch (attrKey) {\n case 'reset-before':\n options.resetBeforeFragments = list;\n break;\n case 'reset':\n options.resetFragments = list;\n break;\n case 'refetch':\n options.refetchFragments = list;\n break;\n case 'click':\n options.clickFragments = list;\n break;\n case 'copy':\n options.copyFragments = list;\n break;\n case 'open':\n options.openFragments = list;\n break;\n case 'close':\n options.closeFragments = list;\n break;\n }\n }\n });\n }\n\n // 非イベントの data / form(data-fetch-data / data-fetch-form)も取り込む\n if (!event) {\n if (fragment.hasAttribute(Procedure.attrName(null, 'data', true))) {\n options.dataAttrName = Procedure.attrName(null, 'data', true);\n }\n if (fragment.hasAttribute(Procedure.attrName(null, 'form', true))) {\n const formSelector = fragment.getRawAttribute(\n Procedure.attrName(null, 'form', true),\n ) as string | null;\n if (formSelector) {\n const formElement = document.body.querySelector(formSelector);\n if (formElement !== null) {\n options.formFragment = Form.getFormFragment(\n Fragment.get(formElement) as ElementFragment,\n );\n } else {\n Log.error(\n 'Haori',\n `Form element not found: ${formSelector} (` +\n `${Procedure.attrName(null, 'fetch-form', true)})`,\n );\n }\n } else {\n // 属性はあるが値が省略された場合は自要素もしくは先祖の form を対象\n options.formFragment = Form.getFormFragment(fragment);\n }\n }\n }\n\n // fetch が指定されているのにバインド先が無い場合、デフォルトで自要素にバインド\n if (\n hasFetchAttr &&\n (!options.bindFragments || options.bindFragments.length === 0)\n ) {\n options.bindFragments = [fragment];\n }\n return options;\n }\n\n /**\n * ElementFragment の構造的タイプガード。\n *\n * @param value チェックする値\n * @returns ElementFragment である場合は true、それ以外は false\n */\n private static isElementFragment(value: unknown): value is ElementFragment {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.getTarget === 'function' &&\n typeof obj.getChildElementFragments === 'function'\n );\n }\n\n /** オプション */\n private readonly options: ProcedureOptions;\n\n /** reset-before 後に確定した historyData スナップショット */\n private historyDataSnapshot: Record<string, unknown> | null | undefined;\n\n /** reset-before 後に確定した historyForm スナップショット */\n private historyFormSnapshot: Record<string, unknown> | null | undefined;\n\n /**\n * オプションを指定してProcedureクラスのインスタンスを生成します。\n *\n * @param options オプション\n */\n constructor(options: ProcedureOptions);\n\n /**\n * フラグメントの属性からオプションを生成してProcedureクラスのインスタンスを生成します。\n *\n * @param fragment フラグメント\n * @param event イベント名\n */\n constructor(fragment: ElementFragment, event: string | null);\n\n /**\n * コンストラクタ。\n *\n * @param arg1 オプションもしくはフラグメント\n * @param arg2 イベント名\n */\n constructor(\n arg1: ProcedureOptions | ElementFragment,\n arg2: string | null = null,\n ) {\n if (Procedure.isElementFragment(arg1)) {\n this.options = Procedure.buildOptions(arg1, arg2);\n this.eventType = arg2;\n } else {\n this.options = arg1;\n this.eventType = null;\n }\n }\n\n /**\n * 非イベント data-fetch の自動再評価用シグネチャを解決します。\n *\n * @param fragment 対象フラグメント\n * @returns フェッチシグネチャと未解決参照の有無\n */\n public static resolveAutoFetchSignature(\n fragment: ElementFragment,\n ): ResolvedFetchSignature {\n return new Procedure(fragment, null).resolveFetchSignature();\n }\n\n /**\n * 一連の処理を実行します。オプションが空の場合は即座にresolveされます。\n *\n * @returns 実行結果のPromise\n */\n run(): Promise<void> {\n return this.runWithResult().then(() => undefined);\n }\n\n /**\n * 一連の処理を実行し、成功したかどうかを返します。\n *\n * @returns 成功した場合は true、途中停止や失敗時は false\n */\n runWithResult(): Promise<boolean> {\n return this.execute();\n }\n\n /**\n * 一連の処理を実行します。成功結果を内部で扱うための実体です。\n *\n * @returns 実行成功時は true、停止や失敗時は false\n */\n private async execute(): Promise<boolean> {\n const executionLock = this.acquireExecutionLock();\n if (executionLock === false) {\n return false;\n }\n\n try {\n if (Object.keys(this.options).length === 0) {\n return false;\n }\n if (\n this.options.formFragment &&\n this.validate(this.options.formFragment) === false\n ) {\n return false;\n }\n const confirmed = await this.confirm();\n if (!confirmed) {\n return false;\n }\n if (\n this.options.resetBeforeFragments &&\n this.options.resetBeforeFragments.length > 0\n ) {\n await Promise.all(\n this.options.resetBeforeFragments.map(fragment =>\n Form.reset(fragment),\n ),\n );\n this.captureHistorySnapshots();\n }\n const preparedRequest = this.prepareFetchRequest();\n const payload = preparedRequest.payload;\n let fetchUrl = preparedRequest.url;\n let fetchOptions = preparedRequest.options;\n if (this.options.beforeCallback) {\n const result = this.options.beforeCallback(\n fetchUrl || null,\n fetchOptions || null,\n );\n if (result !== undefined && result !== null) {\n if (result === false || (typeof result === 'object' && result.stop)) {\n return false;\n }\n if (typeof result === 'object') {\n fetchUrl = ('fetchUrl' in result ? result.fetchUrl : fetchUrl) as\n | string\n | null;\n fetchOptions = (\n 'fetchOptions' in result ? result.fetchOptions : fetchOptions\n ) as RequestInit | null;\n }\n }\n }\n\n const hasPayload = Object.keys(payload).length > 0;\n if (fetchUrl) {\n const finalOptions: RequestInit = {...(fetchOptions || {})};\n const requestedMethod = preparedRequest.requestedMethod;\n const method = preparedRequest.effectiveMethod;\n const isDemoQueryNormalization =\n preparedRequest.transportMode === 'query-get';\n const queryString = preparedRequest.queryString;\n\n if (isDemoQueryNormalization) {\n Log.info('Haori demo fetch normalization', {\n runtime: Env.runtime,\n requestedMethod,\n effectiveMethod: method,\n transportMode: 'query-get',\n url: fetchUrl,\n payload: hasPayload ? payload : undefined,\n queryString,\n });\n }\n\n // fetchstartイベントを発火\n if (this.options.targetFragment && fetchUrl) {\n const startedAt = performance.now();\n const fetchStartMetadata = {\n runtime: Env.runtime,\n requestedMethod,\n effectiveMethod: method,\n transportMode: isDemoQueryNormalization ? 'query-get' : 'http',\n ...(isDemoQueryNormalization ? {queryString} : {}),\n };\n\n HaoriEvent.fetchStart(\n this.options.targetFragment.getTarget(),\n fetchUrl,\n finalOptions,\n hasPayload ? payload : undefined,\n fetchStartMetadata,\n );\n\n return fetch(fetchUrl, finalOptions)\n .then(response => {\n return this.handleFetchResult(\n response,\n fetchUrl || undefined,\n startedAt,\n );\n })\n .catch(error => {\n if (fetchUrl) {\n HaoriEvent.fetchError(\n this.options.targetFragment!.getTarget(),\n fetchUrl,\n error,\n );\n }\n throw error;\n });\n }\n return fetch(fetchUrl, finalOptions).then(response => {\n return this.handleFetchResult(response, fetchUrl || undefined);\n });\n }\n\n // fetchUrlが無い場合(changeイベント等)、bindFragmentsが無ければformFragmentにバインド\n if (\n (!this.options.bindFragments ||\n this.options.bindFragments.length === 0) &&\n this.options.formFragment &&\n hasPayload\n ) {\n // 双方向バインディング: フォーム値を自動的にバインディングデータに反映\n const formFragment = this.options.formFragment;\n const formElement = formFragment.getTarget();\n const skipFragments = new Set<ElementFragment>();\n if (\n executionLock &&\n executionLock.appliedDisabledAttribute &&\n this.options.targetFragment\n ) {\n skipFragments.add(this.options.targetFragment);\n }\n\n formElement.setAttribute(`${Env.prefix}bind`, JSON.stringify(payload));\n\n const bindingData = formFragment.getBindingData();\n Object.assign(bindingData, payload);\n await Core.setBindingData(formElement, bindingData, skipFragments);\n }\n\n const merged = hasPayload ? payload : {};\n const response = new Response(JSON.stringify(merged), {\n headers: {'Content-Type': 'application/json'},\n });\n return this.handleFetchResult(response);\n } finally {\n this.releaseExecutionLock(executionLock);\n }\n }\n\n /**\n * click 手続きの重複実行を防ぐためのロックを取得します。\n *\n * @returns ロック情報。取得不要なら null、取得失敗なら false。\n */\n private acquireExecutionLock(): ExecutionLockState | null | false {\n if (this.eventType !== 'click' || !this.options.targetFragment) {\n return null;\n }\n\n const targetFragment = this.options.targetFragment;\n const target = targetFragment.getTarget();\n if (\n Procedure.RUNNING_CLICK_TARGETS.has(target) ||\n target.matches(':disabled') ||\n target.hasAttribute('disabled') ||\n target.hasAttribute(PROCEDURE_CLICK_LOCK_MARKER)\n ) {\n return false;\n }\n\n Procedure.RUNNING_CLICK_TARGETS.add(target);\n target.setAttribute(PROCEDURE_CLICK_LOCK_MARKER, '');\n target.setAttribute('disabled', '');\n return {\n target,\n appliedDisabledAttribute: true,\n };\n }\n\n /**\n * 取得済みの実行ロックを解放します。\n *\n * @param executionLock 解放対象のロック情報。\n * @returns 戻り値はありません。\n */\n private releaseExecutionLock(\n executionLock: ExecutionLockState | null | false,\n ): void {\n if (!executionLock) {\n return;\n }\n\n Procedure.RUNNING_CLICK_TARGETS.delete(executionLock.target);\n if (executionLock.appliedDisabledAttribute) {\n executionLock.target.removeAttribute('disabled');\n executionLock.target.removeAttribute(PROCEDURE_CLICK_LOCK_MARKER);\n }\n }\n\n /**\n * フェッチ後の処理を実行します。\n */\n private async handleFetchResult(\n response: Response,\n url?: string,\n startedAt?: number,\n ): Promise<boolean> {\n const activeHaori = resolveProcedureHaoriApi();\n // エラー応答時は以後の処理を停止し、メッセージを伝播\n if (!response.ok) {\n if (this.options.targetFragment && url) {\n HaoriEvent.fetchError(\n this.options.targetFragment.getTarget(),\n url,\n new Error(`${response.status} ${response.statusText}`),\n response.status,\n startedAt,\n );\n }\n await this.handleFetchError(response);\n return false;\n }\n\n // fetchendイベントを発火\n if (this.options.targetFragment && url && startedAt) {\n HaoriEvent.fetchEnd(\n this.options.targetFragment.getTarget(),\n url,\n response.status,\n startedAt,\n );\n }\n\n if (this.options.afterCallback) {\n const result = this.options.afterCallback(response);\n if (result !== undefined && result !== null) {\n if (result === false || (typeof result === 'object' && result.stop)) {\n return false;\n }\n if (typeof result === 'object' && 'response' in result) {\n response = (\n 'response' in result ? result.response : response\n ) as Response;\n }\n }\n }\n const promises: Promise<unknown>[] = [];\n promises.push(this.bindResult(response));\n promises.push(this.adjust());\n promises.push(this.addRow());\n promises.push(this.removeRow());\n promises.push(this.movePrevRow());\n promises.push(this.moveNextRow());\n await Promise.all(promises);\n\n if (this.options.resetFragments && this.options.resetFragments.length > 0) {\n await Promise.all(\n this.options.resetFragments.map(fragment => Form.reset(fragment)),\n );\n }\n\n await this.copy();\n\n const deferredPromises: Promise<unknown>[] = [];\n if (\n this.options.refetchFragments &&\n this.options.refetchFragments.length > 0\n ) {\n this.options.refetchFragments.forEach(fragment => {\n deferredPromises.push(new Procedure(fragment, null).run());\n });\n }\n if (this.options.clickFragments && this.options.clickFragments.length > 0) {\n this.options.clickFragments.forEach(fragment => {\n const target = fragment.getTarget();\n if (typeof target.click === 'function') {\n target.click();\n } else {\n target.dispatchEvent(\n new MouseEvent('click', {bubbles: true, cancelable: true}),\n );\n }\n });\n }\n if (this.options.openFragments && this.options.openFragments.length > 0) {\n this.options.openFragments.forEach(fragment => {\n const target = fragment.getTarget();\n if (target instanceof HTMLElement) {\n deferredPromises.push(activeHaori.openDialog(target));\n } else {\n Log.error('Haori', 'Element is not an HTML element: ', target);\n }\n });\n }\n if (this.options.closeFragments && this.options.closeFragments.length > 0) {\n this.options.closeFragments.forEach(fragment => {\n const target = fragment.getTarget();\n if (target instanceof HTMLElement) {\n deferredPromises.push(activeHaori.closeDialog(target));\n } else {\n Log.error('Haori', 'Element is not an HTML element: ', target);\n }\n });\n }\n // 仕様順序: 先に各種操作(bind/adjust/row/reset/refetch/click/open/close)を完了\n await Promise.all(deferredPromises);\n // その後にダイアログ/トーストを表示\n if (this.options.dialogMessage) {\n await activeHaori.dialog(this.options.dialogMessage);\n }\n if (this.options.toastMessage) {\n await activeHaori.toast(\n this.options.toastMessage,\n this.options.toastLevel ?? 'info',\n );\n }\n this.pushHistory();\n if (this.options.scrollTarget) {\n const el = document.querySelector<HTMLElement>(this.options.scrollTarget);\n el?.scrollIntoView({behavior: 'smooth', block: 'nearest'});\n }\n if (this.options.redirectUrl) {\n window.location.href = this.options.redirectUrl;\n }\n return true;\n }\n\n /**\n * history.pushState を実行します。\n *\n * `historyUrl` / `historyData` / `historyFormFragment` の内容を基に URL を組み立て、\n * `history.pushState()` を呼び出します。いずれも未指定の場合は何もしません。\n * 不正 URL・オリジン違反・例外は `Log.error` でログ出力してスキップし、後続処理は継続します。\n */\n private pushHistory(): void {\n const hasHistoryUrl =\n this.options.historyUrl !== undefined && this.options.historyUrl !== null;\n const historyDataValues = this.resolveHistoryDataValues();\n const historyFormValues = this.resolveHistoryFormValues();\n const hasHistoryData =\n historyDataValues !== undefined && historyDataValues !== null;\n const hasHistoryForm =\n historyFormValues !== undefined && historyFormValues !== null;\n\n if (!hasHistoryUrl && !hasHistoryData && !hasHistoryForm) {\n return;\n }\n\n try {\n const baseUrlString = hasHistoryUrl\n ? (this.options.historyUrl as string)\n : window.location.pathname;\n const url = new URL(baseUrlString, window.location.href);\n\n if (url.origin !== window.location.origin) {\n const errorMessage =\n 'history.pushState: cross-origin URL is not allowed: ' +\n url.toString();\n Log.error('Haori', errorMessage);\n return;\n }\n\n const appendParams = (values: Record<string, unknown>): void => {\n for (const [k, v] of Object.entries(values)) {\n if (v === undefined || v === null) {\n continue;\n }\n if (Array.isArray(v)) {\n v.forEach(item => url.searchParams.append(k, String(item)));\n } else if (typeof v === 'object') {\n url.searchParams.set(k, JSON.stringify(v));\n } else {\n url.searchParams.set(k, String(v));\n }\n }\n };\n\n if (hasHistoryData) {\n appendParams(historyDataValues as Record<string, unknown>);\n }\n if (hasHistoryForm) {\n appendParams(historyFormValues as Record<string, unknown>);\n }\n\n history.pushState(\n {[PROCEDURE_HISTORY_STATE_KEY]: true},\n '',\n url.toString(),\n );\n } catch (e) {\n Log.error('Haori', `history.pushState failed: ${e}`);\n }\n }\n\n /**\n * フェッチエラー応答のメッセージを適切な要素へ伝播します。\n */\n private async handleFetchError(response: Response): Promise<boolean> {\n // ベースとなるフォーム/フラグメントを決定\n let baseFragment: ElementFragment | null = null;\n if (this.options.formFragment) {\n baseFragment = this.options.formFragment;\n } else if (this.options.targetFragment) {\n baseFragment =\n Form.getFormFragment(this.options.targetFragment) ||\n this.options.targetFragment;\n }\n\n const addGeneralMessage = async (message: string) => {\n const targetEl = baseFragment ? baseFragment.getTarget() : document.body;\n await resolveProcedureHaoriApi().addErrorMessage(targetEl, message);\n };\n\n const scrollToFirstError = () => {\n if (!this.options.scrollOnError) {\n return;\n }\n const root = baseFragment ? baseFragment.getTarget() : document.body;\n // addErrorMessage はフォーム以外の target に対して parentElement へエラーを付与するため、\n // root 自身・parentElement・root 配下の順で探索する\n const errorTarget =\n root.getAttribute('data-message-level') === 'error'\n ? root\n : root.parentElement?.getAttribute('data-message-level') === 'error'\n ? root.parentElement\n : root.querySelector<HTMLElement>('[data-message-level=\"error\"]');\n errorTarget?.scrollIntoView({behavior: 'smooth', block: 'nearest'});\n };\n\n // コンテンツタイプに応じて解析\n const contentType = response.headers.get('Content-Type') || '';\n if (contentType.includes('application/json')) {\n try {\n const data = await response.json();\n // 代表的な形式に対応\n const entries: Array<{key?: string; message: string}> = [];\n if (data && typeof data === 'object') {\n if (typeof data.message === 'string') {\n entries.push({message: data.message});\n }\n if (Array.isArray(data.messages)) {\n for (const m of data.messages) {\n if (typeof m === 'string') {\n entries.push({message: m});\n }\n }\n }\n if (data.errors && typeof data.errors === 'object') {\n for (const [k, v] of Object.entries(data.errors)) {\n if (Array.isArray(v)) {\n entries.push({key: k, message: v.join('\\n')});\n } else if (typeof v === 'string') {\n entries.push({key: k, message: v});\n } else if (v != null) {\n entries.push({key: k, message: String(v)});\n }\n }\n }\n // キー: 値(文字列/配列)形式にフォールバック\n if (entries.length === 0) {\n for (const [k, v] of Object.entries(data)) {\n if (k === 'message' || k === 'messages' || k === 'errors') {\n continue;\n }\n if (Array.isArray(v)) {\n entries.push({key: k, message: v.join('\\n')});\n } else if (typeof v === 'string') {\n entries.push({key: k, message: v});\n }\n }\n }\n }\n if (entries.length === 0) {\n // 汎用メッセージ\n await addGeneralMessage(`${response.status} ${response.statusText}`);\n scrollToFirstError();\n return false;\n }\n // メッセージを反映\n for (const e of entries) {\n if (e.key && baseFragment) {\n await Form.addErrorMessage(baseFragment, e.key, e.message);\n } else {\n await addGeneralMessage(e.message);\n }\n }\n scrollToFirstError();\n return false;\n } catch {\n // JSON 解析失敗時はテキストにフォールバック\n }\n }\n // テキストとして処理\n try {\n const text = await response.text();\n if (text && text.trim().length > 0) {\n await addGeneralMessage(text.trim());\n } else {\n await addGeneralMessage(`${response.status} ${response.statusText}`);\n }\n } catch {\n await addGeneralMessage(`${response.status} ${response.statusText}`);\n }\n scrollToFirstError();\n return false;\n }\n\n /**\n * 対象のフラグメント以下の入力要素に対してバリデーションを実行します。\n * バリデーションエラーがある場合は、最初のエラー要素にフォーカスを移動します。\n *\n * @param fragment 対象のフラグメント\n * @returns バリデーション結果(true: 成功, false: 失敗)\n */\n validate(fragment: ElementFragment): boolean {\n if (this.options.valid !== true) {\n return true;\n }\n const firstInvalid = this.findFirstInvalid(fragment);\n if (firstInvalid === null) {\n return true;\n }\n // 検出フェーズ(findFirstInvalid)は checkValidity で副作用なく走査済み。\n // reportValidity と focus は確定した 1 要素にだけ呼び出す。\n (\n firstInvalid as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n ).reportValidity();\n firstInvalid.focus();\n if (this.options.scrollOnError) {\n firstInvalid.scrollIntoView({behavior: 'smooth', block: 'nearest'});\n }\n return false;\n }\n\n /**\n * 対象フラグメント以下で DOM 順の最上部にある invalid 要素を返します。\n * 副作用のない checkValidity のみを使用し、検出のみを行います。\n *\n * @param fragment 対象のフラグメント\n * @returns 最初の invalid 要素、なければ null\n */\n private findFirstInvalid(fragment: ElementFragment): HTMLElement | null {\n // 子要素を逆順に処理することで、DOM 順の先頭要素が最後に found を上書きし、\n // 最終的に最上部の invalid 要素が返る\n let found: HTMLElement | null = null;\n for (const child of fragment.getChildElementFragments().reverse()) {\n const result = this.findFirstInvalid(child);\n if (result !== null) {\n found = result;\n }\n }\n // 自身は子より DOM 上位にあるため、invalid なら子の結果を上書きする\n if (!this.checkOne(fragment)) {\n return fragment.getTarget();\n }\n return found;\n }\n\n /**\n * 対象のフラグメントに対して、副作用なく有効性を検査します。\n * reportValidity は使わず checkValidity のみ呼び出します。\n *\n * @param fragment 対象のフラグメント\n * @returns 有効なら true、無効なら false\n */\n private checkOne(fragment: ElementFragment): boolean {\n const target = fragment.getTarget();\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLSelectElement ||\n target instanceof HTMLTextAreaElement\n ) {\n return target.checkValidity();\n }\n return true;\n }\n\n /**\n * 確認メッセージを表示し、ユーザーの確認を求めます。\n * メッセージが設定されていない場合は、即座に成功とみなします。\n *\n * @returns ユーザーの確認結果を含むPromise(true: 確認, false: キャンセル)\n */\n private confirm(): Promise<boolean> {\n const message = this.options.confirmMessage;\n if (message === null || message === undefined) {\n return Promise.resolve(true);\n }\n return resolveProcedureHaoriApi().confirm(message);\n }\n\n /**\n * 結果データを対象のフラグメントにバインドします。\n *\n * @param response フェッチのレスポンスオブジェクト\n */\n private bindResult(response: Response): Promise<void> {\n if (\n !this.options.bindFragments ||\n this.options.bindFragments.length === 0\n ) {\n return Promise.resolve();\n }\n const promise = response.headers\n .get('Content-Type')\n ?.includes('application/json')\n ? response.json()\n : response.text();\n return promise.then(data => {\n if (this.options.bindParams) {\n const newData = {} as Record<string, unknown>;\n this.options.bindParams.forEach(param => {\n if (data && typeof data === 'object' && param in data) {\n newData[param] = data[param];\n }\n });\n data = newData;\n }\n const promises: Promise<unknown>[] = [];\n if (this.options.bindArg) {\n this.options.bindFragments!.forEach(fragment => {\n const bindingData = fragment.getBindingData();\n const bindArg = this.options.bindArg as string;\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const currentValue = bindingData[bindArg];\n const currentObject =\n currentValue &&\n typeof currentValue === 'object' &&\n !Array.isArray(currentValue)\n ? (currentValue as Record<string, unknown>)\n : {};\n bindingData[bindArg] = this.mergeAppendBindingData(\n fragment,\n data as Record<string, unknown>,\n currentObject,\n );\n } else {\n bindingData[bindArg] = data;\n }\n promises.push(Core.setBindingData(fragment.getTarget(), bindingData));\n });\n } else if (typeof data === 'string') {\n Log.error('Haori', 'string data cannot be bound without a bindArg.');\n return Promise.reject(\n new Error('string data cannot be bound without a bindArg.'),\n );\n } else {\n this.options.bindFragments!.forEach(fragment => {\n const resolvedData = this.mergeAppendBindingData(\n fragment,\n data as Record<string, unknown>,\n );\n promises.push(\n Core.setBindingData(fragment.getTarget(), resolvedData),\n );\n });\n }\n return Promise.all(promises).then(() => undefined);\n });\n }\n\n /**\n * bind-append 指定があるキーについて、既存配列と結合したデータを返します。\n */\n private mergeAppendBindingData(\n fragment: ElementFragment,\n data: Record<string, unknown>,\n currentData: Record<string, unknown> = fragment.getBindingData(),\n ): Record<string, unknown> {\n if (\n !this.options.bindAppendParams ||\n this.options.bindAppendParams.length === 0\n ) {\n return data;\n }\n\n const merged = {...data};\n const current = currentData;\n for (const key of this.options.bindAppendParams) {\n const incoming = merged[key];\n const existing = current[key];\n if (Array.isArray(existing) && Array.isArray(incoming)) {\n merged[key] = existing.concat(incoming);\n }\n }\n return merged;\n }\n\n /**\n * 指定されたフラグメントへバインディングデータをコピーします。\n */\n private copy(): Promise<void> {\n if (\n !this.options.copyFragments ||\n this.options.copyFragments.length === 0\n ) {\n return Promise.resolve();\n }\n\n const sourceData = this.resolveCopySourceData();\n const copyData = this.pickCopyData(sourceData);\n const promises = this.options.copyFragments.map(fragment => {\n const bindingData = {\n ...fragment.getBindingData(),\n ...copyData,\n };\n return Core.setBindingData(fragment.getTarget(), bindingData);\n });\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * copy のコピー元データを取得します。\n */\n private resolveCopySourceData(): Record<string, unknown> {\n if (this.options.formFragment) {\n return Form.getValues(this.options.formFragment);\n }\n if (this.options.targetFragment) {\n return {...this.options.targetFragment.getBindingData()};\n }\n return {};\n }\n\n /**\n * data 属性とフォーム値を統合した送信データを作成します。\n *\n * @returns 送信データ。\n */\n private buildPayload(): Record<string, unknown> {\n return this.buildPayloadResolution().payload;\n }\n\n /**\n * data 属性とフォーム値を統合した送信データを作成し、未解決参照の有無を返します。\n *\n * @returns 送信データと未解決参照の有無。\n */\n private buildPayloadResolution(): PayloadResolution {\n const payload: Record<string, unknown> = {};\n let hasUnresolvedReference = false;\n if (this.options.formFragment) {\n Object.assign(payload, Form.getValues(this.options.formFragment));\n }\n if (this.options.data && typeof this.options.data === 'object') {\n Object.assign(payload, this.options.data);\n }\n if (this.options.targetFragment && this.options.dataAttrName) {\n const resolvedData = Procedure.resolveDataAttributeDetailed(\n this.options.targetFragment,\n this.options.dataAttrName,\n );\n hasUnresolvedReference =\n hasUnresolvedReference || resolvedData.hasUnresolvedReference;\n if (resolvedData.value) {\n Object.assign(payload, resolvedData.value);\n }\n }\n return {payload, hasUnresolvedReference};\n }\n\n /**\n * 現在の data-fetch 実行内容を比較用シグネチャへ正規化します。\n *\n * @returns フェッチシグネチャと未解決参照の有無。\n */\n private resolveFetchSignature(): ResolvedFetchSignature {\n const preparedRequest = this.prepareFetchRequest();\n return {\n signature: preparedRequest.signature,\n hasUnresolvedReference: preparedRequest.hasUnresolvedReference,\n };\n }\n\n /**\n * 現在のオプションから送信前の fetch リクエストを組み立てます。\n *\n * @returns リクエスト情報。\n */\n private prepareFetchRequest(): PreparedFetchRequest {\n const payloadResolution = this.buildPayloadResolution();\n const payload = payloadResolution.payload;\n const hasUnresolvedReference =\n Boolean(this.options.fetchHasUnresolvedReference) ||\n payloadResolution.hasUnresolvedReference;\n\n if (!this.options.fetchUrl || hasUnresolvedReference) {\n return {\n url: null,\n options: null,\n payload,\n hasUnresolvedReference,\n requestedMethod: 'GET',\n effectiveMethod: 'GET',\n transportMode: 'http',\n signature: null,\n };\n }\n\n let fetchUrl = this.options.fetchUrl;\n const finalOptions: RequestInit = {...(this.options.fetchOptions || {})};\n const headers = new Headers(\n (finalOptions.headers as HeadersInit | undefined) || undefined,\n );\n const requestedMethod = (finalOptions.method || 'GET').toUpperCase();\n const isDemoQueryNormalization =\n Env.runtime === 'demo' && !isQueryTransportMethod(requestedMethod);\n const method = isDemoQueryNormalization ? 'GET' : requestedMethod;\n\n finalOptions.method = method;\n\n if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') {\n if (Object.keys(payload).length > 0) {\n fetchUrl = appendPayloadToUrl(fetchUrl, payload);\n }\n } else if (Object.keys(payload).length > 0) {\n const contentType = headers.get('Content-Type') || '';\n if (/multipart\\/form-data/i.test(contentType)) {\n headers.delete('Content-Type');\n const formData = new FormData();\n for (const [k, v] of Object.entries(payload)) {\n if (v === undefined || v === null) {\n formData.append(k, '');\n } else if (v instanceof Blob) {\n formData.append(k, v);\n } else if (Array.isArray(v)) {\n v.forEach(item => formData.append(k, String(item)));\n } else if (typeof v === 'object') {\n formData.append(k, JSON.stringify(v));\n } else {\n formData.append(k, String(v));\n }\n }\n finalOptions.body = formData;\n } else if (/application\\/x-www-form-urlencoded/i.test(contentType)) {\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(payload)) {\n if (v === undefined) {\n continue;\n }\n if (v === null) {\n params.append(k, '');\n } else if (Array.isArray(v)) {\n v.forEach(item => params.append(k, String(item)));\n } else if (typeof v === 'object') {\n params.append(k, JSON.stringify(v));\n } else {\n params.append(k, String(v));\n }\n }\n finalOptions.body = params;\n } else {\n headers.set('Content-Type', 'application/json');\n finalOptions.body = JSON.stringify(payload);\n }\n }\n\n finalOptions.headers = headers;\n let queryString: string | undefined;\n\n if (isDemoQueryNormalization) {\n queryString = new URL(fetchUrl, window.location.href).search || undefined;\n headers.delete('Content-Type');\n }\n\n return {\n url: fetchUrl,\n options: finalOptions,\n payload,\n hasUnresolvedReference: false,\n requestedMethod,\n effectiveMethod: method,\n queryString,\n transportMode: isDemoQueryNormalization ? 'query-get' : 'http',\n signature: buildFetchSignature(fetchUrl, finalOptions),\n };\n }\n\n /**\n * reset-before 後の history 用スナップショットを保存します。\n */\n private captureHistorySnapshots(): void {\n if (this.options.targetFragment && this.options.historyDataAttrName) {\n this.historyDataSnapshot = Procedure.resolveDataAttribute(\n this.options.targetFragment,\n this.options.historyDataAttrName,\n );\n } else {\n this.historyDataSnapshot = undefined;\n }\n\n this.historyFormSnapshot = this.options.historyFormFragment\n ? Form.getValues(this.options.historyFormFragment)\n : undefined;\n }\n\n /**\n * history-data の評価値を取得します。\n *\n * @returns history-data の評価値。\n */\n private resolveHistoryDataValues():\n | Record<string, unknown>\n | null\n | undefined {\n if (this.historyDataSnapshot !== undefined) {\n return this.historyDataSnapshot;\n }\n if (this.options.targetFragment && this.options.historyDataAttrName) {\n return Procedure.resolveDataAttribute(\n this.options.targetFragment,\n this.options.historyDataAttrName,\n );\n }\n return this.options.historyData;\n }\n\n /**\n * history-form の評価値を取得します。\n *\n * @returns history-form の評価値。\n */\n private resolveHistoryFormValues():\n | Record<string, unknown>\n | null\n | undefined {\n if (this.historyFormSnapshot !== undefined) {\n return this.historyFormSnapshot;\n }\n if (this.options.historyFormFragment) {\n return Form.getValues(this.options.historyFormFragment);\n }\n return undefined;\n }\n\n /**\n * copy-params が指定されている場合は include / exclude を考慮して抽出します。\n */\n private pickCopyData(\n sourceData: Record<string, unknown>,\n ): Record<string, unknown> {\n if (!this.options.copyParams || this.options.copyParams.length === 0) {\n return sourceData;\n }\n\n const includeParams = new Set<string>();\n const excludeParams = new Set<string>();\n\n this.options.copyParams.forEach(param => {\n const trimmedParam = param.trim();\n if (!trimmedParam) {\n return;\n }\n if (trimmedParam.startsWith('!')) {\n const excludedParam = trimmedParam.slice(1).trim();\n if (excludedParam) {\n excludeParams.add(excludedParam);\n }\n return;\n }\n includeParams.add(trimmedParam);\n });\n\n const filtered: Record<string, unknown> = {};\n const sourceKeys =\n includeParams.size > 0\n ? Array.from(includeParams)\n : Object.keys(sourceData);\n\n sourceKeys.forEach(param => {\n if (!(param in sourceData)) {\n return;\n }\n if (excludeParams.has(param)) {\n return;\n }\n filtered[param] = sourceData[param];\n });\n\n return filtered;\n }\n\n /**\n * 値の増減を行います。\n */\n private adjust(): Promise<void> {\n if (\n !this.options.adjustFragments ||\n this.options.adjustFragments.length === 0\n ) {\n return Promise.resolve();\n }\n const adjustValue = this.options.adjustValue ?? 0;\n const promises: Promise<void>[] = [];\n for (const fragment of this.options.adjustFragments) {\n let valueString = fragment.getValue();\n if (\n valueString === null ||\n valueString === undefined ||\n valueString === ''\n ) {\n valueString = '0';\n }\n let value = Number(valueString);\n if (isNaN(value)) {\n value = 0;\n }\n value += adjustValue;\n promises.push(fragment.setValue(String(value)));\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * 行フラグメントを取得します。\n *\n * @returns 行フラグメントまたはnull\n */\n private getRowFragment(): ElementFragment | null {\n if (!this.options.targetFragment) {\n Log.error('Haori', 'Target fragment is not specified for row operation.');\n return null;\n }\n const rowFragment = this.options.targetFragment.closestByAttribute(\n `${Env.prefix}row`,\n );\n if (!rowFragment) {\n Log.error('Haori', 'Row fragment not found.');\n return null;\n }\n return rowFragment;\n }\n\n /**\n * 行を追加します。\n *\n * @returns 処理結果のPromise\n */\n private addRow(): Promise<void> {\n if (this.options.rowAdd !== true) {\n return Promise.resolve();\n }\n const rowFragment = this.getRowFragment();\n if (!rowFragment) {\n return Promise.reject(new Error('Row fragment not found.'));\n }\n const promises: Promise<void>[] = [];\n const newFragment = rowFragment.clone();\n promises.push(\n rowFragment.getParent()!.insertAfter(newFragment, rowFragment),\n );\n promises.push(Core.evaluateAll(newFragment));\n // 追加された行のフォーム要素をリセット\n promises.push(Form.reset(newFragment as ElementFragment));\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * 行を削除します。\n *\n * @returns 処理結果のPromise\n */\n private removeRow(): Promise<void> {\n if (this.options.rowRemove !== true) {\n return Promise.resolve();\n }\n const rowFragment = this.getRowFragment();\n if (!rowFragment) {\n return Promise.reject(new Error('Row fragment not found.'));\n }\n // 1行だった場合は削除しない\n const parent = rowFragment.getParent();\n if (parent) {\n const siblings = parent.getChildElementFragments().filter(child => {\n // data-each-before と data-each-after を除外\n return (\n !child.hasAttribute(`${Env.prefix}each-before`) &&\n !child.hasAttribute(`${Env.prefix}each-after`)\n );\n });\n if (siblings.length <= 1) {\n return Promise.resolve();\n }\n }\n return rowFragment.remove();\n }\n\n /**\n * 前の行へ移動します。\n *\n * @returns 処理結果のPromise\n */\n private movePrevRow(): Promise<void> {\n if (this.options.rowMovePrev !== true) {\n return Promise.resolve();\n }\n const rowFragment = this.getRowFragment();\n if (!rowFragment) {\n return Promise.reject(new Error('Row fragment not found.'));\n }\n const prevFragment = rowFragment.getPrevious();\n if (!prevFragment) {\n return Promise.resolve();\n }\n const parent = rowFragment.getParent();\n if (!parent) {\n return Promise.resolve();\n }\n return parent.insertBefore(rowFragment, prevFragment);\n }\n\n /**\n * 次の行へ移動します。\n *\n * @returns 処理結果のPromise\n */\n private moveNextRow(): Promise<void> {\n if (this.options.rowMoveNext !== true) {\n return Promise.resolve();\n }\n const rowFragment = this.getRowFragment();\n if (!rowFragment) {\n return Promise.reject(new Error('Row fragment not found.'));\n }\n const nextFragment = rowFragment.getNext();\n if (!nextFragment) {\n return Promise.resolve();\n }\n const parent = rowFragment.getParent();\n if (!parent) {\n return Promise.resolve();\n }\n return parent.insertAfter(rowFragment, nextFragment);\n }\n}\n","/**\n * @fileoverview URLパラメータ取得クラス\n *\n * URLのクエリパラメータを取得します。\n */\n\nexport default class Url {\n /**\n * URLのクエリパラメータを取得します。\n *\n * @returns URLのクエリパラメータのキーと値のマップ\n */\n public static readParams(): Record<string, string> {\n const params: Record<string, string> = {};\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n urlParams.forEach((value, key) => {\n params[key] = value;\n });\n return params;\n }\n}\n","/**\n * @fileoverview HTMLインポート機能\n *\n * 指定URLの HTML を取得し、body タグの中身のみを取り出します。\n * 仕様: data-import — 指定したURLの body タグの中身を対象エレメントの innerHTML に設定する。\n */\nimport Log from './log';\n\n/**\n * インポート機能を提供するクラスです。\n */\nexport class Import {\n /**\n * 指定URLから HTML を取得し、body 内の HTML 文字列を返します。\n *\n * 振る舞い:\n * - HTTP ステータスが成功以外の場合は例外を投げます。\n * - HTML のパースに失敗した場合はログを出力し、テキスト全体を返します(フォールバック)。\n * - body タグが存在しない場合もテキスト全体を返します(フォールバック)。\n *\n * @param url 取得先の URL\n * @param init fetch のオプション(任意)\n * @returns body 内の HTML 文字列\n */\n public static async load(url: string, init?: RequestInit): Promise<string> {\n let response: Response;\n try {\n response = await fetch(url, init);\n } catch (e) {\n Log.error('[Haori]', 'Failed to fetch import source:', url, e);\n throw new Error(`Failed to fetch: ${url}`);\n }\n\n if (!response.ok) {\n // ネットワーク/HTTP エラーは上位で扱いやすいように例外化\n const status = `${response.status} ${response.statusText}`;\n Log.error('[Haori]', 'Import HTTP error:', url, status);\n throw new Error(`Failed to load ${url}: ${status}`);\n }\n\n let text: string;\n try {\n text = await response.text();\n } catch (e) {\n Log.error('[Haori]', 'Failed to read response text:', url, e);\n throw new Error(`Failed to read response from: ${url}`);\n }\n\n // HTML としてパースし、body 内のみを返す\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(text, 'text/html');\n if (doc && doc.body) {\n return doc.body.innerHTML;\n }\n Log.warn('[Haori]', 'No body found in imported document:', url);\n return text;\n } catch (e) {\n // パース失敗時はフォールバックとしてテキスト全体を返す\n Log.error('[Haori]', 'Failed to parse imported HTML:', url, e);\n return text;\n }\n }\n}\n","/**\n * @fileoverview Core機能\n *\n * Fragmentの管理、属性変化の監視、条件分岐・繰り返し処理など、\n * アプリケーションの中心的な機能を提供します。\n */\nimport Env from './env';\nimport Dev from './dev';\nimport Expression from './expression';\nimport Form from './form';\nimport Fragment, {ElementFragment, TextFragment} from './fragment';\nimport Log from './log';\nimport Procedure from './procedure';\nimport Url from './url';\nimport {Import} from './import';\nimport Queue from './queue';\nimport HaoriEvent from './event';\n\ninterface ReactiveFetchState {\n lastSignature: string | null;\n running: boolean;\n rerunRequested: boolean;\n}\n\ninterface ReactiveImportState {\n lastUrl: string | null;\n running: boolean;\n rerunRequested: boolean;\n}\n\ntype DerivedSubtreeSignatureSource = 'evaluateAll' | 'refresh';\n\ninterface DerivedSubtreeProfile {\n hostId: string;\n signatureComputeTotal: number;\n signatureComputeFromEvaluateAll: number;\n signatureComputeFromRefresh: number;\n skipHitCount: number;\n skipMissCount: number;\n skipIneligibleCount: number;\n}\n\n/**\n * アプリケーションの中心的な制御を行うクラスです。\n * Fragment の初期化、属性変化の処理、条件分岐・繰り返し処理を管理します。\n */\nexport default class Core {\n /** 属性エイリアスのサフィックス */\n private static readonly ATTRIBUTE_ALIAS_SUFFIX = 'attr-';\n\n /** 優先処理する属性のサフィックス(処理順序で定義) */\n private static readonly PRIORITY_ATTRIBUTE_SUFFIXES = [\n 'bind',\n 'url-param',\n 'derive-name',\n 'derive',\n 'if',\n 'each',\n ];\n\n /** 遅延処理する属性のサフィックス */\n private static readonly DEFERRED_ATTRIBUTE_SUFFIXES = ['fetch'];\n\n /** evaluateAll で再評価対象から除外する特殊属性のサフィックス */\n private static readonly EVALUATE_ALL_EXCLUDED_ATTRIBUTE_SUFFIXES = [\n 'bind',\n 'derive',\n 'derive-name',\n 'if',\n 'each',\n 'fetch',\n 'import',\n 'url-param',\n ];\n\n /** 属性内プレースホルダ検出用の正規表現 */\n private static readonly ATTRIBUTE_PLACEHOLDER_REGEX =\n /\\{\\{\\{[\\s\\S]+?\\}\\}\\}|\\{\\{[\\s\\S]+?\\}\\}/;\n\n /** data-fetch の自動再評価状態 */\n private static readonly REACTIVE_FETCH_STATES = new WeakMap<\n HTMLElement,\n ReactiveFetchState\n >();\n\n /** data-import の自動再評価状態 */\n private static readonly REACTIVE_IMPORT_STATES = new WeakMap<\n HTMLElement,\n ReactiveImportState\n >();\n\n /** data-derive subtree skip の開発用プロファイル */\n private static readonly DERIVE_SUBTREE_PROFILES = new WeakMap<\n ElementFragment,\n DerivedSubtreeProfile\n >();\n\n /**\n * 遅延属性かどうか(完全名で判定)を判定します。\n *\n * @param name 属性名\n * @returns 遅延属性かどうか\n */\n private static isDeferredAttributeName(name: string): boolean {\n return Core.DEFERRED_ATTRIBUTE_SUFFIXES.some(\n suffix => name === `${Env.prefix}${suffix}`,\n );\n }\n\n /**\n * evaluateAll で再評価対象から除外する特殊属性かどうかを判定します。\n *\n * @param name 属性名\n * @returns 除外対象かどうか\n */\n private static isEvaluateAllExcludedAttributeName(name: string): boolean {\n return Core.EVALUATE_ALL_EXCLUDED_ATTRIBUTE_SUFFIXES.some(\n suffix => name === `${Env.prefix}${suffix}`,\n );\n }\n\n /**\n * evaluateAll で通常属性を再評価すべきかを判定します。\n *\n * @param name 属性名\n * @param value 属性の生値\n * @returns 再評価する場合は true\n */\n private static shouldReevaluateAttribute(\n name: string,\n value: string | null,\n ): boolean {\n return (\n value !== null &&\n !Core.isEvaluateAllExcludedAttributeName(name) &&\n Core.ATTRIBUTE_PLACEHOLDER_REGEX.test(value)\n );\n }\n\n /**\n * data-attr-* 形式の属性名から実際に更新する属性名を取得します。\n *\n * @param name 属性名\n * @returns 実際の属性名。data-attr-* でない場合は null\n */\n private static getAliasedAttributeName(name: string): string | null {\n const aliasPrefix = `${Env.prefix}${Core.ATTRIBUTE_ALIAS_SUFFIX}`;\n if (!name.startsWith(aliasPrefix) || name.length <= aliasPrefix.length) {\n return null;\n }\n return name.slice(aliasPrefix.length);\n }\n\n /**\n * 実属性の変更が data-attr-* の内部反映かどうかを判定します。\n *\n * @param element 対象要素\n * @param name 変更された属性名\n * @returns data-attr-* の内部反映なら true\n */\n public static isAliasedAttributeReflection(\n element: HTMLElement,\n name: string,\n ): boolean {\n const fragment = Fragment.get(element);\n if (!(fragment instanceof ElementFragment)) {\n return false;\n }\n return fragment.hasAttribute(\n `${Env.prefix}${Core.ATTRIBUTE_ALIAS_SUFFIX}${name}`,\n );\n }\n\n /**\n * プレースホルダを含む通常属性を再評価します。\n * 内部状態の更新は同期的に行い、DOM 反映は fragment 側の非同期更新に委ねます。\n *\n * @param fragment 対象フラグメント\n * @returns 再評価完了の Promise\n */\n private static reevaluateInterpolatedAttributes(\n fragment: ElementFragment,\n ): Promise<void> {\n let chain = Promise.resolve();\n for (const name of fragment.getAttributeNames()) {\n const rawValue = fragment.getRawAttribute(name);\n if (!Core.shouldReevaluateAttribute(name, rawValue)) {\n continue;\n }\n chain = chain.then(() =>\n Core.setAttribute(fragment.getTarget(), name, rawValue),\n );\n }\n return chain.then(() => undefined);\n }\n\n /**\n * 指定フラグメントの直下の子孫評価を再実行します。\n *\n * @param fragment 対象フラグメント\n * @returns 再評価完了の Promise\n */\n private static reevaluateChildren(fragment: ElementFragment): Promise<void> {\n const promises: Promise<void>[] = [];\n fragment.getChildren().forEach(child => {\n if (child instanceof ElementFragment) {\n promises.push(Core.evaluateAll(child));\n } else if (child instanceof TextFragment) {\n promises.push(Core.evaluateText(child));\n }\n });\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * data-fetch の再評価状態を取得します。\n *\n * @param element 対象要素\n * @returns 再評価状態\n */\n private static getReactiveFetchState(\n element: HTMLElement,\n ): ReactiveFetchState {\n const existing = Core.REACTIVE_FETCH_STATES.get(element);\n if (existing) {\n return existing;\n }\n const state: ReactiveFetchState = {\n lastSignature: null,\n running: false,\n rerunRequested: false,\n };\n Core.REACTIVE_FETCH_STATES.set(element, state);\n return state;\n }\n\n /**\n * data-import の再評価状態を取得します。\n *\n * @param element 対象要素\n * @returns 再評価状態\n */\n private static getReactiveImportState(\n element: HTMLElement,\n ): ReactiveImportState {\n const existing = Core.REACTIVE_IMPORT_STATES.get(element);\n if (existing) {\n return existing;\n }\n const state: ReactiveImportState = {\n lastUrl: null,\n running: false,\n rerunRequested: false,\n };\n Core.REACTIVE_IMPORT_STATES.set(element, state);\n return state;\n }\n\n /**\n * bind 更新時に data-fetch / data-import を専用ルートで再評価します。\n *\n * @param fragment 対象フラグメント\n * @param skipFragments 再評価をスキップするフラグメント集合\n * @returns 再評価完了の Promise\n */\n private static reevaluateReactiveSpecialAttributes(\n fragment: ElementFragment,\n skipFragments: ReadonlySet<ElementFragment> = new Set(),\n ): Promise<void> {\n if (skipFragments.has(fragment)) {\n return Promise.resolve();\n }\n const promises: Promise<void>[] = [];\n if (fragment.hasAttribute(`${Env.prefix}fetch`)) {\n promises.push(Core.executeManagedFetch(fragment));\n }\n if (fragment.hasAttribute(`${Env.prefix}import`)) {\n promises.push(Core.executeManagedImport(fragment));\n }\n fragment.getChildren().forEach(child => {\n if (child instanceof ElementFragment) {\n promises.push(\n Core.reevaluateReactiveSpecialAttributes(child, skipFragments),\n );\n }\n });\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * data-fetch をシグネチャ比較付きで実行します。\n *\n * @param fragment 対象フラグメント\n * @returns 実行完了の Promise\n */\n private static executeManagedFetch(fragment: ElementFragment): Promise<void> {\n const target = fragment.getTarget();\n const state = Core.getReactiveFetchState(target);\n const resolved = Procedure.resolveAutoFetchSignature(fragment);\n\n if (state.running) {\n if (\n resolved.hasUnresolvedReference ||\n resolved.signature !== state.lastSignature\n ) {\n state.rerunRequested = true;\n }\n return Promise.resolve();\n }\n\n if (resolved.hasUnresolvedReference || resolved.signature === null) {\n state.lastSignature = null;\n return Promise.resolve();\n }\n\n if (state.lastSignature === resolved.signature) {\n return Promise.resolve();\n }\n\n state.lastSignature = resolved.signature;\n state.running = true;\n return new Procedure(fragment, null)\n .runWithResult()\n .then(() => undefined)\n .finally(() => {\n state.running = false;\n if (state.rerunRequested) {\n state.rerunRequested = false;\n return Core.executeManagedFetch(fragment);\n }\n return undefined;\n });\n }\n\n /**\n * data-import を URL 比較付きで実行します。\n *\n * @param fragment 対象フラグメント\n * @returns 実行完了の Promise\n */\n private static executeManagedImport(\n fragment: ElementFragment,\n ): Promise<void> {\n const target = fragment.getTarget();\n const state = Core.getReactiveImportState(target);\n const importEvaluation = fragment.getAttributeEvaluation(\n `${Env.prefix}import`,\n );\n const resolvedUrl =\n importEvaluation &&\n !importEvaluation.hasUnresolvedReference &&\n typeof importEvaluation.value === 'string' &&\n importEvaluation.value !== ''\n ? importEvaluation.value\n : null;\n\n if (state.running) {\n if (resolvedUrl !== state.lastUrl) {\n state.rerunRequested = true;\n }\n return Promise.resolve();\n }\n\n if (resolvedUrl === null) {\n state.lastUrl = null;\n return Promise.resolve();\n }\n\n if (state.lastUrl === resolvedUrl) {\n return Promise.resolve();\n }\n\n state.lastUrl = resolvedUrl;\n state.running = true;\n const startedAt = performance.now();\n target.setAttribute(`${Env.prefix}importing`, '');\n HaoriEvent.importStart(target, resolvedUrl);\n\n return Import.load(resolvedUrl)\n .then(html => {\n const bytes = new TextEncoder().encode(html).length;\n return Queue.enqueue(() => {\n target.innerHTML = html;\n }).then(() => {\n target.removeAttribute(`${Env.prefix}importing`);\n HaoriEvent.importEnd(target, resolvedUrl, bytes, startedAt);\n if (!document.body.hasAttribute('data-haori-ready')) {\n const childPromises: Promise<void>[] = [];\n target.childNodes.forEach(node => {\n const child = Fragment.get(node);\n if (child instanceof ElementFragment) {\n childPromises.push(Core.scan(child.getTarget()));\n } else if (child instanceof TextFragment) {\n childPromises.push(Core.evaluateText(child));\n }\n });\n return Promise.all(childPromises).then(() => undefined);\n }\n return undefined;\n });\n })\n .catch(error => {\n target.removeAttribute(`${Env.prefix}importing`);\n HaoriEvent.importError(target, resolvedUrl, error);\n Log.error('[Haori]', 'Failed to import HTML:', resolvedUrl, error);\n })\n .finally(() => {\n state.running = false;\n if (state.rerunRequested) {\n state.rerunRequested = false;\n return Core.executeManagedImport(fragment);\n }\n return undefined;\n }) as Promise<void>;\n }\n\n /**\n * 指定された要素と、その子要素をスキャンし、Fragmentを生成します。\n *\n * @param element スキャン対象の要素\n * @returns Promise (スキャンが完了したときに解決される)\n */\n public static scan(element: HTMLElement): Promise<void> {\n const fragment = Fragment.get(element);\n if (!fragment) {\n return Promise.resolve();\n }\n return Core.initializeElementFragment(fragment, false);\n }\n\n /**\n * 新規 each 行を局所初期化します。\n * 既存 scan の属性順序を保ちつつ、Fragment 木を直接たどります。\n *\n * @param fragment 新規挿入された行フラグメント\n * @returns 初期化完了の Promise\n */\n private static initializeFreshEachRow(\n fragment: ElementFragment,\n ): Promise<void> {\n return Core.initializeElementFragment(fragment, true).then(() => {\n if (Core.needsScheduledEvaluateAll(fragment)) {\n Core.scheduleEvaluateAll(fragment);\n }\n return undefined;\n });\n }\n\n /**\n * ElementFragment とその子孫を初期化します。\n *\n * @param fragment 対象フラグメント\n * @param stopAtEach true の場合、data-each 要素では通常再帰を止める\n * @returns 初期化完了の Promise\n */\n private static initializeElementFragment(\n fragment: ElementFragment,\n stopAtEach: boolean,\n ): Promise<void> {\n Core.syncMountedState(fragment);\n if (stopAtEach && fragment.isFreshInitializationSkippable()) {\n return Promise.resolve();\n }\n return Core.initializeElementAttributes(fragment).then(() => {\n if (Core.shouldSkipChildInitialization(fragment, stopAtEach)) {\n Core.refreshDerivedSubtreeSignature(fragment);\n return undefined;\n }\n const childPromises: Promise<void>[] = [];\n fragment.getChildren().forEach(child => {\n if (child instanceof ElementFragment) {\n childPromises.push(Core.initializeElementFragment(child, stopAtEach));\n } else if (child instanceof TextFragment) {\n childPromises.push(Core.evaluateText(child));\n }\n });\n return Promise.all(childPromises).then(() => {\n Core.refreshDerivedSubtreeSignature(fragment);\n return undefined;\n });\n });\n }\n\n /**\n * 要素初期化時の mounted 状態を同期します。\n *\n * @param fragment 対象フラグメント\n */\n private static syncMountedState(fragment: ElementFragment): void {\n const parent = fragment.getParent();\n if (parent?.isMounted()) {\n fragment.setMounted(true);\n return;\n }\n const target = fragment.getTarget();\n if (target.parentNode && document.body.contains(target)) {\n fragment.setMounted(true);\n return;\n }\n fragment.setMounted(false);\n }\n\n /**\n * scan と fresh clone 初期化で共有する属性初期化を行います。\n *\n * @param fragment 対象フラグメント\n * @returns 属性初期化完了の Promise\n */\n private static initializeElementAttributes(\n fragment: ElementFragment,\n ): Promise<void> {\n let attributeChain = Promise.resolve();\n const processedAttributes = new Set<string>();\n for (const suffix of Core.PRIORITY_ATTRIBUTE_SUFFIXES) {\n // 優先属性の処理\n const name = Env.prefix + suffix;\n if (fragment.hasAttribute(name)) {\n attributeChain = attributeChain.then(() =>\n Core.setAttribute(\n fragment.getTarget(),\n name,\n fragment.getRawAttribute(name),\n ),\n );\n processedAttributes.add(name);\n }\n }\n for (const name of fragment.getAttributeNames()) {\n if (processedAttributes.has(name) || Core.isDeferredAttributeName(name)) {\n // すでに処理済みもしくは遅延処理の属性はスキップ\n continue;\n }\n const value = fragment.getRawAttribute(name);\n if (value !== null) {\n attributeChain = attributeChain.then(() =>\n Core.setAttribute(fragment.getTarget(), name, value),\n );\n }\n }\n for (const suffix of Core.DEFERRED_ATTRIBUTE_SUFFIXES) {\n // 遅延属性の処理\n const name = Env.prefix + suffix;\n if (fragment.hasAttribute(name)) {\n attributeChain = attributeChain.then(() =>\n Core.setAttribute(\n fragment.getTarget(),\n name,\n fragment.getRawAttribute(name),\n ),\n );\n processedAttributes.add(name);\n }\n }\n return attributeChain.then(() => undefined);\n }\n\n /**\n * 子孫初期化をスキップすべきかどうかを返します。\n *\n * @param fragment 対象フラグメント\n * @param stopAtEach true の場合、data-each 要素で通常再帰を止める\n * @returns 子孫初期化をスキップするなら true\n */\n private static shouldSkipChildInitialization(\n fragment: ElementFragment,\n stopAtEach: boolean,\n ): boolean {\n const condition = fragment.getAttribute(`${Env.prefix}if`);\n if (\n fragment.hasAttribute(`${Env.prefix}if`) &&\n (condition === false ||\n condition === undefined ||\n condition === null ||\n Number.isNaN(condition))\n ) {\n return true;\n }\n return stopAtEach && fragment.hasAttribute(`${Env.prefix}each`);\n }\n\n /**\n * エレメントに属性を設定します。\n * 属性固有の処理も行います。\n *\n * @param element エレメント\n * @param name 属性名\n * @param value 属性値\n * @returns Promise (DOM操作が完了したときに解決される)\n */\n public static setAttribute(\n element: HTMLElement,\n name: string,\n value: string | null,\n fromObserver = false,\n ): Promise<void> {\n const fragment = Fragment.get(element);\n const aliasedAttributeName = Core.getAliasedAttributeName(name);\n if (aliasedAttributeName !== null) {\n if (value === null) {\n return fragment.removeAliasedAttribute(name, aliasedAttributeName);\n }\n return fragment.setAliasedAttribute(\n name,\n aliasedAttributeName,\n value,\n fromObserver,\n );\n }\n const promises: Promise<void>[] = [];\n let deriveChangedPromise: Promise<boolean> | null = null;\n let nextDeriveInputSignature: string | null = null;\n switch (name) {\n case `${Env.prefix}bind`: {\n if (value === null) {\n fragment.clearBindingDataCache();\n fragment.setBindingData({});\n } else {\n fragment.setBindingData(Core.parseDataBind(value));\n }\n break;\n }\n case `${Env.prefix}derive`:\n nextDeriveInputSignature = Core.createDeriveInputSignature(\n fragment,\n value,\n fragment.getRawAttribute(`${Env.prefix}derive-name`),\n );\n deriveChangedPromise = Core.evaluateDerive(\n fragment,\n value,\n fragment.getRawAttribute(`${Env.prefix}derive-name`),\n );\n promises.push(deriveChangedPromise.then(() => undefined));\n break;\n case `${Env.prefix}derive-name`:\n nextDeriveInputSignature = Core.createDeriveInputSignature(\n fragment,\n fragment.getRawAttribute(`${Env.prefix}derive`),\n value,\n );\n deriveChangedPromise = Core.evaluateDerive(\n fragment,\n fragment.getRawAttribute(`${Env.prefix}derive`),\n value,\n );\n promises.push(deriveChangedPromise.then(() => undefined));\n break;\n case `${Env.prefix}if`:\n promises.push(Core.evaluateIf(fragment));\n break;\n case `${Env.prefix}each`:\n promises.push(Core.evaluateEach(fragment));\n break;\n case `${Env.prefix}fetch`:\n promises.push(Core.executeManagedFetch(fragment));\n break;\n case `${Env.prefix}import`:\n if (typeof value === 'string') {\n promises.push(Core.executeManagedImport(fragment));\n }\n break;\n case `${Env.prefix}url-param`: {\n const arg = fragment.getAttribute(`${Env.prefix}url-arg`);\n const params = Url.readParams();\n if (arg === null) {\n promises.push(Core.setBindingData(element, params));\n } else {\n const data = fragment.getRawBindingData() || {};\n data[String(arg)] = params;\n promises.push(Core.setBindingData(element, data));\n }\n break;\n }\n }\n if (value === null) {\n promises.push(fragment.removeAttribute(name));\n } else {\n promises.push(fragment.setAttribute(name, value, fromObserver));\n }\n return Promise.all(promises)\n .then(() => {\n if (deriveChangedPromise !== null) {\n fragment.setDeriveInputSignature(nextDeriveInputSignature);\n return deriveChangedPromise.then(changed => {\n if (!changed) {\n return undefined;\n }\n return Core.reevaluateChildren(fragment);\n });\n }\n return undefined;\n })\n .then(() => undefined);\n }\n\n /**\n * エレメントに属性を設定し、評価を行います。\n *\n * @param element エレメント\n * @param name 属性名\n * @param value 属性値\n * @returns Promise (DOM操作が完了したときに解決される)\n */\n public static setBindingData(\n element: HTMLElement,\n data: Record<string, unknown>,\n skipFragments: ReadonlySet<ElementFragment> = new Set(),\n ): Promise<void> {\n const fragment = Fragment.get(element) as ElementFragment;\n const previous = fragment.getRawBindingData();\n fragment.setBindingData(data);\n let chain = fragment.setAttribute(\n `${Env.prefix}bind`,\n JSON.stringify(data),\n );\n if (element.tagName === 'FORM') {\n const arg = fragment.getAttribute(`${Env.prefix}form-arg`);\n const formValues =\n arg &&\n data[String(arg)] &&\n typeof data[String(arg)] === 'object' &&\n !Array.isArray(data[String(arg)])\n ? (data[String(arg)] as Record<string, unknown>)\n : arg\n ? {}\n : data;\n chain = chain.then(() => Form.syncValues(fragment, formValues));\n }\n chain = chain.then(() => Core.evaluateAll(fragment, skipFragments));\n chain = chain.then(() =>\n Core.reevaluateReactiveSpecialAttributes(fragment, skipFragments),\n );\n\n // bindchangeイベントを発火\n HaoriEvent.bindChange(element, previous, data, 'manual');\n\n return chain.then(() => undefined);\n }\n\n /**\n * data-bind 属性の値をパースします。\n *\n * @param data data-bind 属性の値\n * @returns パースされたデータオブジェクト\n */\n public static parseDataBind(data: string): Record<string, unknown> {\n if (data.startsWith('{') || data.startsWith('[')) {\n // JSONとしてパース\n try {\n return JSON.parse(data);\n } catch (e) {\n Log.error('[Haori]', 'Invalid JSON in data-bind:', e);\n return {};\n }\n } else {\n // URLSearchParamsでパース\n const params = new URLSearchParams(data);\n const result: Record<string, unknown> = {};\n for (const [key, value] of params.entries()) {\n if (result[key] !== undefined) {\n // すでに値がある場合は配列化\n if (Array.isArray(result[key])) {\n (result[key] as string[]).push(value);\n } else {\n result[key] = [result[key], value];\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n }\n\n /**\n * ノードを親要素に追加し評価を行います。\n *\n * @param parentElement 親エレメント\n * @param node 追加するノード\n */\n public static addNode(parentElement: HTMLElement, node: Node) {\n const parent = Fragment.get(parentElement);\n // skipMutationNodesが設定されている場合は処理をスキップ\n if (parent.isSkipMutationNodes()) {\n return;\n }\n const next = Fragment.get(node.nextSibling);\n const fragment = Fragment.get(node);\n if (fragment) {\n parent.insertBefore(fragment, next);\n if (fragment instanceof ElementFragment) {\n // 新規追加ノードは属性評価(bind/if/each/import など含む)のフルスキャンを行う。\n // これにより、取り込まれた断片内の data-import の入れ子や data-bind も正しく処理される。\n Core.scan(fragment.getTarget());\n } else if (fragment instanceof TextFragment) {\n Core.evaluateText(fragment);\n }\n }\n }\n\n /**\n * ノードを親要素から削除します。\n *\n * @param node 削除するノード\n */\n public static removeNode(node: Node) {\n const fragment = Fragment.get(node);\n if (fragment) {\n const parent = fragment.getParent();\n // skipMutationNodesが設定されている場合は処理をスキップ\n if (parent && parent.isSkipMutationNodes()) {\n return;\n }\n fragment.remove();\n }\n }\n\n /**\n * ノードのテキストを変更します。\n *\n * @param node 変更するノード\n * @param text 新しいテキスト\n */\n public static changeText(node: Text | Comment, text: string) {\n const fragment = Fragment.get(node);\n if (fragment) {\n fragment.setContent(text);\n }\n }\n\n /**\n * エレメントの値を変更します。\n * フォームの双方向バインディングを考慮し、フォームのバインドデータも更新します。\n *\n * @param element 変更するエレメント\n * @param value 新しい値\n * @returns Promise (DOM操作が完了したときに解決される)\n */\n public static changeValue(\n element: HTMLElement,\n value: string,\n ): Promise<void> {\n const fragment = Fragment.get(element);\n if (fragment.getValue() === value) {\n return Promise.resolve();\n }\n const promises: Promise<void>[] = [];\n promises.push(fragment.setValue(value));\n const formFragment = Core.getFormFragment(fragment);\n if (formFragment) {\n const values = Form.getValues(formFragment);\n const arg = formFragment.getAttribute(`${Env.prefix}form-arg`);\n let bindingData;\n if (arg) {\n bindingData = formFragment.getRawBindingData();\n if (!bindingData) {\n bindingData = {};\n }\n bindingData[String(arg)] = values;\n } else {\n bindingData = values;\n }\n promises.push(Core.setBindingData(formFragment.getTarget(), bindingData));\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * フォームフラグメントを取得します。\n *\n * @param fragment フラグメント\n * @returns フォームフラグメントまたはnull\n */\n private static getFormFragment(\n fragment: ElementFragment,\n ): ElementFragment | null {\n if (fragment.getTarget() instanceof HTMLFormElement) {\n return fragment;\n }\n const parent = fragment.getParent();\n if (parent) {\n return Core.getFormFragment(parent);\n }\n return null;\n }\n\n /**\n * フラグメントとその子要素を評価します。\n *\n * @param fragment 対象フラグメント\n * @return Promise (DOM操作が完了したときに解決される)\n */\n public static evaluateAll(\n fragment: ElementFragment,\n skipFragments: ReadonlySet<ElementFragment> = new Set(),\n ): Promise<void> {\n if (skipFragments.has(fragment)) {\n return Promise.resolve();\n }\n let chain = Core.reevaluateInterpolatedAttributes(fragment);\n const hasDerive = fragment.hasAttribute(`${Env.prefix}derive`);\n const hasIf = fragment.hasAttribute(`${Env.prefix}if`);\n const hasEach = fragment.hasAttribute(`${Env.prefix}each`);\n const deriveExpression = fragment.getRawAttribute(`${Env.prefix}derive`);\n const deriveName = fragment.getRawAttribute(`${Env.prefix}derive-name`);\n let shouldSkipDerivedSubtree = false;\n let shouldRecordDerivedSubtreeSignature = false;\n let nextDerivedSubtreeSignature: string | null = null;\n if (!hasDerive && fragment.getDeriveSubtreeSignature() !== null) {\n fragment.setDeriveSubtreeSignature(null);\n }\n if (!hasDerive && fragment.getDeriveInputSignature() !== null) {\n fragment.setDeriveInputSignature(null);\n }\n if (hasDerive) {\n const nextDeriveInputSignature = Core.createDeriveInputSignature(\n fragment,\n deriveExpression,\n deriveName,\n );\n if (nextDeriveInputSignature === null) {\n if (fragment.getDeriveInputSignature() !== null) {\n fragment.setDeriveInputSignature(null);\n }\n chain = chain.then(() =>\n Core.evaluateDerive(fragment, deriveExpression, deriveName).then(\n () => undefined,\n ),\n );\n } else if (\n fragment.getDeriveInputSignature() !== nextDeriveInputSignature\n ) {\n chain = chain.then(() => {\n return Core.evaluateDerive(\n fragment,\n deriveExpression,\n deriveName,\n ).then(() => {\n fragment.setDeriveInputSignature(nextDeriveInputSignature);\n return undefined;\n });\n });\n }\n }\n if (hasIf) {\n chain = chain.then(() => Core.evaluateIf(fragment));\n }\n if (hasEach) {\n if (fragment.getDeriveSubtreeSignature() !== null) {\n fragment.setDeriveSubtreeSignature(null);\n }\n return chain.then(() => Core.evaluateEach(fragment));\n }\n if (hasIf) {\n if (fragment.getDeriveSubtreeSignature() !== null) {\n fragment.setDeriveSubtreeSignature(null);\n }\n return chain.then(() => undefined);\n }\n if (hasDerive) {\n chain = chain.then(() => {\n if (!Core.canSkipStableDerivedSubtree(fragment)) {\n fragment.setDeriveSubtreeSignature(null);\n Core.logDerivedSubtreeProfileSnapshot(fragment, 'skip-ineligible');\n return;\n }\n nextDerivedSubtreeSignature = Core.createDescendantBindingSignature(\n fragment,\n 'evaluateAll',\n );\n shouldRecordDerivedSubtreeSignature = true;\n shouldSkipDerivedSubtree =\n fragment.getDeriveSubtreeSignature() !== null &&\n fragment.getDeriveSubtreeSignature() === nextDerivedSubtreeSignature;\n Core.logDerivedSubtreeProfileSnapshot(\n fragment,\n shouldSkipDerivedSubtree ? 'skip-hit' : 'skip-miss',\n );\n });\n }\n return chain\n .then(() => {\n if (shouldSkipDerivedSubtree) {\n return undefined;\n }\n const promises: Promise<void>[] = [];\n fragment.getChildren().forEach(child => {\n if (child instanceof ElementFragment) {\n if (Core.canSkipUnchangedNestedEach(child)) {\n return;\n }\n promises.push(Core.evaluateAll(child, skipFragments));\n } else if (child instanceof TextFragment) {\n promises.push(Core.evaluateText(child));\n }\n });\n return Promise.all(promises).then(() => undefined);\n })\n .then(() => {\n if (\n shouldRecordDerivedSubtreeSignature &&\n nextDerivedSubtreeSignature !== null\n ) {\n fragment.setDeriveSubtreeSignature(nextDerivedSubtreeSignature);\n }\n return undefined;\n });\n }\n\n /**\n * data-derive / data-derive-name を評価し、子孫要素向けの派生値を更新します。\n *\n * @param fragment 対象フラグメント\n * @param deriveExpression 上書きする導出式\n * @param deriveName 上書きする導出名\n * @returns Promise (評価完了時に解決)\n */\n public static evaluateDerive(\n fragment: ElementFragment,\n deriveExpression: string | null = fragment.getRawAttribute(\n `${Env.prefix}derive`,\n ),\n deriveName: string | null = fragment.getRawAttribute(\n `${Env.prefix}derive-name`,\n ),\n ): Promise<boolean> {\n const previousDerivedBindingData = fragment.getRawDerivedBindingData();\n const normalizedName =\n typeof deriveName === 'string' ? deriveName.trim() : '';\n if (!deriveExpression || normalizedName === '') {\n if (previousDerivedBindingData === null) {\n return Promise.resolve(false);\n }\n fragment.setDerivedBindingData(null);\n return Promise.resolve(true);\n }\n const result = Expression.evaluateDetailed(\n deriveExpression,\n fragment.getBindingData(),\n );\n if (result.unresolvedReference) {\n if (previousDerivedBindingData === null) {\n return Promise.resolve(false);\n }\n fragment.setDerivedBindingData(null);\n return Promise.resolve(true);\n }\n const nextDerivedBindingData = {\n [normalizedName]: result.value,\n };\n if (\n Core.createBindingSignature(previousDerivedBindingData) ===\n Core.createBindingSignature(nextDerivedBindingData)\n ) {\n return Promise.resolve(false);\n }\n fragment.setDerivedBindingData(nextDerivedBindingData);\n return Promise.resolve(true);\n }\n\n /**\n * テキストフラグメントを評価します。\n *\n * @param fragment 対象フラグメント\n * @returns Promise (DOM操作が完了したときに解決される)\n */\n public static evaluateText(fragment: TextFragment): Promise<void> {\n return fragment.evaluate();\n }\n\n /**\n * if要素を評価します。\n * 値がfalse、null、undefined、NaNの場合は非表示にし、それ以外の場合は表示します。\n *\n * @param fragment 対象フラグメント\n * @return Promise (DOM操作が完了したときに解決される)\n */\n public static evaluateIf(fragment: ElementFragment): Promise<void> {\n const promises: Promise<void>[] = [];\n const condition = fragment.getAttribute(`${Env.prefix}if`);\n if (\n condition === false ||\n condition === undefined ||\n condition === null ||\n Number.isNaN(condition)\n ) {\n promises.push(\n fragment.hide().then(() => {\n HaoriEvent.hide(fragment.getTarget());\n }),\n );\n } else {\n const childPromises: Promise<void>[] = [];\n fragment.getChildren().forEach(child => {\n if (child instanceof ElementFragment) {\n // 未スキャンの子は scan で初期化し、既に表示済みの子は再評価だけ行う。\n childPromises.push(\n child.isMounted()\n ? Core.evaluateAll(child)\n : Core.scan(child.getTarget()),\n );\n } else if (child instanceof TextFragment) {\n childPromises.push(Core.evaluateText(child));\n }\n });\n promises.push(\n fragment.show().then(() => {\n HaoriEvent.show(fragment.getTarget());\n }),\n );\n promises.push(Promise.all(childPromises).then(() => undefined));\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * each要素を評価します。\n * 非表示または未マウントの場合は処理をスキップします。\n *\n * @param fragment 対象フラグメント\n */\n public static evaluateEach(fragment: ElementFragment): Promise<void> {\n if (!fragment.isVisible() || !fragment.isMounted()) {\n return Promise.resolve();\n }\n const data = Core.resolveEachItems(fragment);\n if (data === null) {\n return Promise.reject(new Error('Invalid each attribute.'));\n }\n let template = fragment.getTemplate();\n const keyArg = fragment.getAttribute(`${Env.prefix}each-key`);\n const nextEachInputSignature = Core.createBindingSignature({\n key: keyArg ? String(keyArg) : null,\n items: data,\n });\n if (template === null) {\n // テンプレートの作成\n let found = false;\n fragment.getChildren().forEach(child => {\n if (found) {\n return;\n }\n if (child instanceof ElementFragment) {\n if (\n child.hasAttribute(`${Env.prefix}each-before`) ||\n child.hasAttribute(`${Env.prefix}each-after`)\n ) {\n return;\n }\n // 最初のElementFragmentをテンプレートとして採用\n template = child.clone();\n Core.markFreshInitializationSkippable(template);\n fragment.setTemplate(template);\n found = true;\n // 元のchildはchildrenから除外\n fragment.removeChild(child);\n // DOMからも必ず除去\n const templateTarget = child.getTarget();\n if (templateTarget.parentNode) {\n templateTarget.parentNode.removeChild(templateTarget);\n }\n child.setMounted(false);\n }\n // TextNodeやCommentNodeはテンプレートにならないので無視\n });\n // テンプレートのunmount完了後にupdateDiffを実行\n return this.updateDiff(fragment, data).then(() => {\n fragment.setEachInputSignature(nextEachInputSignature);\n });\n }\n if (fragment.getEachInputSignature() === nextEachInputSignature) {\n return Promise.resolve();\n }\n return this.updateDiff(fragment, data).then(() => {\n fragment.setEachInputSignature(nextEachInputSignature);\n });\n }\n\n /**\n * data-each 属性値を仕様に従って配列へ正規化します。\n *\n * @param fragment 対象フラグメント\n * @returns 配列。無効な場合は null\n */\n private static resolveEachItems(\n fragment: ElementFragment,\n ): (Record<string, unknown> | string | number)[] | null {\n const evaluation = fragment.getAttributeEvaluation(`${Env.prefix}each`);\n const data = evaluation?.value;\n if (\n evaluation?.hasUnresolvedReference ||\n data === false ||\n data === null ||\n data === undefined\n ) {\n return [];\n }\n if (Array.isArray(data)) {\n return data as (Record<string, unknown> | string | number)[];\n }\n Log.error('[Haori]', 'Invalid each attribute:', data);\n return null;\n }\n\n /**\n * nested data-each の入力が同値で、要素自身に他の動的要素が無い場合は\n * evaluateAll の子走査を省略できるかどうかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @returns 省略可能なら true\n */\n private static canSkipUnchangedNestedEach(\n fragment: ElementFragment,\n ): boolean {\n if (!fragment.hasAttribute(`${Env.prefix}each`)) {\n return false;\n }\n if (fragment.getEachInputSignature() === null) {\n return false;\n }\n const parent = fragment.getParent();\n if (\n parent?.closestByAttribute(`${Env.prefix}derive`) ||\n parent?.closestByAttribute(`${Env.prefix}derive-name`) ||\n parent?.closestByAttribute(`${Env.prefix}if`) ||\n parent?.closestByAttribute(`${Env.prefix}fetch`) ||\n parent?.closestByAttribute(`${Env.prefix}import`)\n ) {\n return false;\n }\n if (Core.hasNonEachDynamicElementState(fragment)) {\n return false;\n }\n const data = Core.resolveEachItems(fragment);\n if (data === null) {\n return false;\n }\n const keyArg = fragment.getAttribute(`${Env.prefix}each-key`);\n const nextEachInputSignature = Core.createBindingSignature({\n key: keyArg ? String(keyArg) : null,\n items: data,\n });\n return fragment.getEachInputSignature() === nextEachInputSignature;\n }\n\n /**\n * data-derive subtree の入力が同値で、保守条件も満たす場合に\n * 子走査を省略できるかどうかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @returns 省略可能なら true\n */\n private static canSkipStableDerivedSubtree(\n fragment: ElementFragment,\n ): boolean {\n if (!fragment.hasAttribute(`${Env.prefix}derive`)) {\n return false;\n }\n if (\n fragment.hasAttribute(`${Env.prefix}if`) ||\n fragment.hasAttribute(`${Env.prefix}each`) ||\n fragment.hasAttribute(`${Env.prefix}fetch`) ||\n fragment.hasAttribute(`${Env.prefix}import`)\n ) {\n return false;\n }\n return !Core.hasDisallowedDerivedSubtreeDescendant(fragment);\n }\n\n /**\n * data-derive subtree skip の初期 PoC で扱わない子孫要素を含むかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @returns 含むなら true\n */\n private static hasDisallowedDerivedSubtreeDescendant(\n fragment: ElementFragment,\n ): boolean {\n return fragment.getChildren().some(child => {\n if (!(child instanceof ElementFragment)) {\n return false;\n }\n if (\n child.hasAttribute(`${Env.prefix}derive`) ||\n child.hasAttribute(`${Env.prefix}derive-name`) ||\n child.hasAttribute(`${Env.prefix}fetch`) ||\n child.hasAttribute(`${Env.prefix}import`)\n ) {\n return true;\n }\n return Core.hasDisallowedDerivedSubtreeDescendant(child);\n });\n }\n\n /**\n * data-derive host が子孫要素へ公開している binding の署名を返します。\n *\n * @param fragment 対象フラグメント\n * @returns binding 署名\n */\n private static createDescendantBindingSignature(\n fragment: ElementFragment,\n source: DerivedSubtreeSignatureSource,\n ): string {\n Core.recordDerivedSubtreeSignatureComputation(fragment, source);\n return Core.createBindingSignature(fragment.getDescendantBindingData());\n }\n\n /**\n * data-derive 実行前の入力署名を返します。\n *\n * @param fragment 対象フラグメント\n * @param deriveExpression 導出式\n * @param deriveName 導出名\n * @returns 入力署名。導出が無効なら null\n */\n private static createDeriveInputSignature(\n fragment: ElementFragment,\n deriveExpression: string | null,\n deriveName: string | null,\n ): string | null {\n const normalizedName =\n typeof deriveName === 'string' ? deriveName.trim() : '';\n if (!deriveExpression || normalizedName === '') {\n return null;\n }\n return Core.createBindingSignature({\n expression: deriveExpression,\n name: normalizedName,\n scope: fragment.getBindingData(),\n });\n }\n\n /**\n * data-derive subtree skip 用の署名を現在状態で更新します。\n *\n * @param fragment 対象フラグメント\n */\n private static refreshDerivedSubtreeSignature(\n fragment: ElementFragment,\n ): void {\n if (!Core.canSkipStableDerivedSubtree(fragment)) {\n fragment.setDeriveSubtreeSignature(null);\n Core.logDerivedSubtreeProfileSnapshot(fragment, 'skip-ineligible');\n return;\n }\n fragment.setDeriveSubtreeSignature(\n Core.createDescendantBindingSignature(fragment, 'refresh'),\n );\n Core.logDerivedSubtreeProfileSnapshot(fragment, 'refresh');\n }\n\n /**\n * data-derive subtree skip のプロファイルを取得または初期化します。\n *\n * @param fragment 対象フラグメント\n * @returns プロファイル\n */\n private static getOrCreateDerivedSubtreeProfile(\n fragment: ElementFragment,\n ): DerivedSubtreeProfile | null {\n if (!Dev.isEnabled() || !fragment.hasAttribute(`${Env.prefix}derive`)) {\n return null;\n }\n const existing = Core.DERIVE_SUBTREE_PROFILES.get(fragment);\n if (existing) {\n return existing;\n }\n const profile: DerivedSubtreeProfile = {\n hostId: Core.createDerivedSubtreeHostId(fragment),\n signatureComputeTotal: 0,\n signatureComputeFromEvaluateAll: 0,\n signatureComputeFromRefresh: 0,\n skipHitCount: 0,\n skipMissCount: 0,\n skipIneligibleCount: 0,\n };\n Core.DERIVE_SUBTREE_PROFILES.set(fragment, profile);\n return profile;\n }\n\n /**\n * data-derive subtree host の識別子を作成します。\n *\n * @param fragment 対象フラグメント\n * @returns host 識別子\n */\n private static createDerivedSubtreeHostId(\n fragment: ElementFragment,\n ): string {\n const segments: string[] = [];\n let current: ElementFragment | null = fragment;\n while (current) {\n const target = current.getTarget();\n if (!(target instanceof HTMLElement)) {\n break;\n }\n let segment = target.tagName.toLowerCase();\n if (target.id.trim() !== '') {\n segment += `#${target.id.trim()}`;\n segments.unshift(segment);\n break;\n }\n const deriveName = current.getRawAttribute(`${Env.prefix}derive-name`);\n if (typeof deriveName === 'string' && deriveName.trim() !== '') {\n segment += `[${Env.prefix}derive-name=\"${deriveName.trim()}\"]`;\n }\n const parent = current.getParent();\n if (parent) {\n const siblingIndex = parent\n .getChildren()\n .filter(child => child instanceof ElementFragment)\n .findIndex(child => child === current);\n segment += `:nth-child(${siblingIndex + 1})`;\n }\n segments.unshift(segment);\n current = parent;\n }\n return segments.join(' > ');\n }\n\n /**\n * data-derive subtree の署名計算回数を記録します。\n *\n * @param fragment 対象フラグメント\n * @param source 計算元\n */\n private static recordDerivedSubtreeSignatureComputation(\n fragment: ElementFragment,\n source: DerivedSubtreeSignatureSource,\n ): void {\n const profile = Core.getOrCreateDerivedSubtreeProfile(fragment);\n if (profile === null) {\n return;\n }\n profile.signatureComputeTotal += 1;\n if (source === 'refresh') {\n profile.signatureComputeFromRefresh += 1;\n return;\n }\n profile.signatureComputeFromEvaluateAll += 1;\n }\n\n /**\n * data-derive subtree の現在プロファイルをログ出力します。\n *\n * @param fragment 対象フラグメント\n * @param reason ログ理由\n */\n private static logDerivedSubtreeProfileSnapshot(\n fragment: ElementFragment,\n reason: 'refresh' | 'skip-hit' | 'skip-miss' | 'skip-ineligible',\n ): void {\n const profile = Core.getOrCreateDerivedSubtreeProfile(fragment);\n if (profile === null) {\n return;\n }\n if (reason === 'skip-hit') {\n profile.skipHitCount += 1;\n } else if (reason === 'skip-miss') {\n profile.skipMissCount += 1;\n } else if (reason === 'skip-ineligible') {\n profile.skipIneligibleCount += 1;\n }\n Log.info('[Haori][derive-profile]', {\n reason,\n hostId: profile.hostId,\n signatureComputeTotal: profile.signatureComputeTotal,\n signatureComputeFromEvaluateAll: profile.signatureComputeFromEvaluateAll,\n signatureComputeFromRefresh: profile.signatureComputeFromRefresh,\n skipHitCount: profile.skipHitCount,\n skipMissCount: profile.skipMissCount,\n skipIneligibleCount: profile.skipIneligibleCount,\n });\n }\n\n /**\n * data-each 以外の動的要素状態を持つかどうかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @returns 該当するなら true\n */\n private static hasNonEachDynamicElementState(\n fragment: ElementFragment,\n ): boolean {\n const allowedEachAttributes = new Set([\n `${Env.prefix}each`,\n `${Env.prefix}each-key`,\n `${Env.prefix}each-arg`,\n `${Env.prefix}each-index`,\n ]);\n const hasDynamicAttributes = fragment.getAttributeNames().some(name => {\n if (allowedEachAttributes.has(name)) {\n return false;\n }\n if (name.startsWith(`${Env.prefix}attr-`)) {\n return true;\n }\n if (name.startsWith(Env.prefix)) {\n return true;\n }\n const value = fragment.getRawAttribute(name);\n return typeof value === 'string' && value.includes('{{');\n });\n if (hasDynamicAttributes) {\n return true;\n }\n return fragment.getChildren().some(\n child => child instanceof TextFragment && child.hasDynamicContent(),\n );\n }\n\n /**\n * fresh clone 初期化を subtree ごと省略できるかどうかを事前計算します。\n *\n * @param fragment 判定対象フラグメント\n * @returns subtree 全体を省略可能なら true\n */\n private static markFreshInitializationSkippable(\n fragment: ElementFragment,\n ): boolean {\n const hasDynamicAttributes = fragment\n .getAttributeNames()\n .some(name => Core.isFreshInitializationDynamicAttribute(fragment, name));\n const hasDynamicChildren = fragment.getChildren().some(child => {\n if (child instanceof ElementFragment) {\n return !Core.markFreshInitializationSkippable(child);\n }\n if (child instanceof TextFragment) {\n return child.hasDynamicContent();\n }\n return false;\n });\n const skippable = !hasDynamicAttributes && !hasDynamicChildren;\n fragment.setFreshInitializationSkippable(skippable);\n return skippable;\n }\n\n /**\n * fresh clone 初期化で再評価が必要な属性かどうかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @param name 属性名\n * @returns 再評価が必要なら true\n */\n private static isFreshInitializationDynamicAttribute(\n fragment: ElementFragment,\n name: string,\n ): boolean {\n if (name.startsWith(`${Env.prefix}attr-`)) {\n return true;\n }\n if (name.startsWith(Env.prefix)) {\n return true;\n }\n const value = fragment.getRawAttribute(name);\n return typeof value === 'string' && value.includes('{{');\n }\n\n /**\n * 差分を更新します。\n *\n * @param parent 親フラグメント\n * @param newList 新しいリスト\n */\n private static updateDiff(\n parent: ElementFragment,\n newList: (Record<string, unknown> | string | number)[],\n ): Promise<void> {\n const template = parent.getTemplate();\n if (template === null) {\n Log.error('[Haori]', 'Template is not set for each element.');\n return Promise.resolve();\n }\n let indexKey = parent.getAttribute(`${Env.prefix}each-index`);\n if (indexKey) {\n indexKey = String(indexKey);\n }\n const keyArg = parent.getAttribute(`${Env.prefix}each-key`);\n const itemArg = parent.getAttribute(`${Env.prefix}each-arg`);\n const keyDataMap: Map<\n string,\n {item: (typeof newList)[0]; itemIndex: number}\n > = new Map();\n const newKeys: string[] = [];\n newList.forEach((item, itemIndex) => {\n const listKey = Core.createListKey(\n item,\n keyArg ? String(keyArg) : null,\n itemIndex,\n );\n newKeys.push(listKey);\n keyDataMap.set(listKey, {item, itemIndex});\n });\n const newKeySet = new Set(newKeys);\n const removalPromises: Promise<void>[] = [];\n let childElements = parent\n .getChildren()\n .filter(child => child instanceof ElementFragment)\n .filter(\n child =>\n !child.hasAttribute(`${Env.prefix}each-before`) &&\n !child.hasAttribute(`${Env.prefix}each-after`),\n );\n const previousKeys = childElements.map(child => child.getListKey());\n childElements = childElements.filter(child => {\n if (!newKeySet.has(String(child.getListKey()))) {\n removalPromises.push(child.remove());\n return false;\n }\n return true;\n });\n const srcKeys = childElements.map(child => child.getListKey());\n const childElementsByKey = new Map<string, ElementFragment>();\n childElements.forEach(child => {\n const listKey = child.getListKey();\n if (listKey !== null && !childElementsByKey.has(listKey)) {\n childElementsByKey.set(listKey, child);\n }\n });\n const insertTargets = parent.getChildElementFragments().slice();\n const baseInsertIndex = insertTargets.filter(child =>\n child.hasAttribute(`${Env.prefix}each-before`),\n ).length;\n let chain = Promise.resolve();\n newKeys.forEach((newKey, loopIndex) => {\n const {item, itemIndex} = keyDataMap.get(newKey)!;\n let child: ElementFragment;\n const reusedChild = childElementsByKey.get(newKey);\n if (reusedChild) {\n // 既存の要素を再利用\n child = reusedChild;\n // 行の入力が同一なら子孫の再評価をスキップする。\n chain = chain.then(() =>\n Core.updateRowFragment(\n child,\n item,\n indexKey as string | null,\n itemIndex,\n itemArg ? String(itemArg) : null,\n newKey,\n ).then(changed => {\n if (!changed) {\n return undefined;\n }\n return Core.evaluateAll(child);\n }),\n );\n } else {\n // 新しい要素を追加\n child = template.clone();\n const currentInsertIndex = baseInsertIndex + loopIndex;\n chain = chain.then(() =>\n Core.updateRowFragment(\n child,\n item,\n indexKey as string | null,\n itemIndex,\n itemArg ? String(itemArg) : null,\n newKey,\n ).then(() => {\n const referenceChild = insertTargets[currentInsertIndex] ?? null;\n return parent\n .insertBefore(child, referenceChild)\n .then(() => {\n insertTargets.splice(currentInsertIndex, 0, child);\n })\n .then(() => Core.initializeFreshEachRow(child));\n }),\n );\n }\n });\n return Promise.all(removalPromises)\n .then(() => chain)\n .then(() => {\n // eachupdateイベントを発火\n const validNewKeys = newKeys.filter(\n (key): key is string => key !== null,\n );\n const validSrcKeys = srcKeys.filter(\n (key): key is string => key !== null,\n );\n const validSrcKeySet = new Set(validSrcKeys);\n const addedKeys = validNewKeys.filter(key => !validSrcKeySet.has(key));\n const previousValidKeys = previousKeys.filter(\n (key): key is string => key !== null,\n );\n const removedKeys = previousValidKeys.filter(\n key => !newKeySet.has(key),\n );\n HaoriEvent.eachUpdate(\n parent.getTarget(),\n addedKeys,\n removedKeys,\n validNewKeys,\n );\n return undefined;\n });\n }\n\n /**\n * リスト比較用のキーを生成します。\n *\n * @param item 対象オブジェクト\n * @param keyArg リストキーに使用するプロパティ名\n * @param index 配列のインデックス\n * @returns リストキー\n */\n private static createListKey(\n item: Record<string, unknown> | string | number,\n keyArg: string | null,\n index: number,\n ): string {\n let listKey: string;\n if (typeof item === 'object' && item !== null) {\n if (keyArg) {\n const key = item[keyArg as string];\n if (key === null || key === undefined) {\n listKey = `__index_${index}`;\n } else if (typeof key == 'object') {\n listKey = JSON.stringify(key);\n } else {\n listKey = String(key);\n }\n } else {\n // data-each-key がない場合はインデックスをキーとして使用\n listKey = `__index_${index}`;\n }\n } else {\n listKey = String(item);\n }\n return listKey;\n }\n\n /**\n * 行フラグメントにデータを設定します。\n *\n * @param rowFragment 行フラグメント\n * @param data 行データ\n * @param indexKey インデックスキー\n * @param index インデックス番号\n * @param arg バインドデータパラメータ名\n * @param listKey リストキー\n * @returns 行メタデータの更新完了 Promise\n */\n private static updateRowFragment(\n rowFragment: ElementFragment,\n data: Record<string, unknown> | string | number,\n indexKey: string | null,\n index: number,\n arg: string | null,\n listKey: string,\n ): Promise<boolean> {\n let bindingData = data;\n if (typeof data === 'object' && data !== null) {\n bindingData = {...data};\n if (indexKey) {\n bindingData[indexKey] = index;\n }\n if (arg) {\n bindingData = {\n [arg]: bindingData,\n };\n }\n } else {\n if (arg) {\n bindingData = {\n [arg]: data,\n };\n if (indexKey) {\n bindingData[indexKey] = index;\n }\n } else {\n Log.error(\n '[Haori]',\n `Primitive value requires '${Env.prefix}each-arg' attribute: ${data}`,\n );\n return Promise.resolve(false);\n }\n }\n const normalizedBindingData = bindingData as Record<string, unknown>;\n const nextRenderSignature = Core.createBindingSignature({\n listKey,\n bindingData: normalizedBindingData,\n });\n if (\n rowFragment.getListKey() === listKey &&\n rowFragment.getRenderSignature() === nextRenderSignature\n ) {\n return Promise.resolve(false);\n }\n rowFragment.setListKey(listKey);\n rowFragment.setRenderSignature(nextRenderSignature);\n rowFragment.setBindingData(normalizedBindingData);\n return rowFragment\n .setAttribute(`${Env.prefix}row`, listKey)\n .then(() => true);\n }\n\n /**\n * 新規挿入行に遅延再評価が必要かどうかを判定します。\n *\n * @param fragment 判定対象の行フラグメント\n * @returns 遅延再評価が必要なら true\n */\n private static needsScheduledEvaluateAll(fragment: ElementFragment): boolean {\n const stack: ElementFragment[] = [fragment];\n while (stack.length > 0) {\n const current = stack.pop()!;\n current.getChildElementFragments().forEach(child => {\n stack.push(child);\n });\n if (\n current !== fragment &&\n !current.isMounted() &&\n Core.hasMountSensitiveAttribute(current)\n ) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * mounted 状態に依存して再評価が必要になりやすい属性を持つかどうかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @returns 該当属性を持つなら true\n */\n private static hasMountSensitiveAttribute(\n fragment: ElementFragment,\n ): boolean {\n return ['fetch', 'import'].some(suffix =>\n fragment.hasAttribute(`${Env.prefix}${suffix}`),\n );\n }\n\n /**\n * バインド値が同一かどうかを再帰的に判定します。\n *\n * @param left 比較元の値\n * @param right 比較先の値\n * @param visited 循環参照対策用の訪問済みペア\n * @returns 同一なら true\n */\n private static createBindingSignature(\n value: unknown,\n seen: WeakMap<object, string> = new WeakMap(),\n nextId: {value: number} = {value: 0},\n ): string {\n if (value === null) {\n return 'null';\n }\n if (value === undefined) {\n return 'undefined';\n }\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n ) {\n return String(value);\n }\n if (typeof value === 'function') {\n return `[Function:${value.name || 'anonymous'}]`;\n }\n if (typeof value === 'symbol') {\n return value.toString();\n }\n if (value instanceof Date) {\n return `[Date:${value.toISOString()}]`;\n }\n if (Array.isArray(value)) {\n if (seen.has(value)) {\n return `[Circular:${seen.get(value)}]`;\n }\n const marker = `array-${nextId.value}`;\n nextId.value += 1;\n seen.set(value, marker);\n return `[${value\n .map(item => Core.createBindingSignature(item, seen, nextId))\n .join(',')}]`;\n }\n if (typeof value === 'object') {\n if (seen.has(value)) {\n return `[Circular:${seen.get(value)}]`;\n }\n const marker = `object-${nextId.value}`;\n nextId.value += 1;\n seen.set(value, marker);\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .sort()\n .map(\n key =>\n `${JSON.stringify(key)}:${Core.createBindingSignature(\n record[key],\n seen,\n nextId,\n )}`,\n )\n .join(',')}}`;\n }\n return String(value);\n }\n\n /**\n * フラグメントの再評価を次のイベントループで実行します。\n *\n * @param fragment 再評価対象のフラグメント\n */\n private static scheduleEvaluateAll(fragment: ElementFragment): void {\n setTimeout(() => {\n void Core.evaluateAll(fragment);\n }, 100);\n }\n}\n","/**\n * @fileoverview イベント振り分け機能\n *\n * クリック/変更/ロード/ポップステートイベントを検出し Procedure に委譲します。\n */\n\nimport Fragment, {ElementFragment} from './fragment';\nimport Procedure from './procedure';\nimport Log from './log';\n\n/**\n * イベントの振り分けを行うクラスです。\n */\nexport default class EventDispatcher {\n /** Haori が history.state に埋め込む状態キー */\n private static readonly HISTORY_STATE_KEY = '__haoriHistoryState__';\n\n /** ルート要素 */\n private readonly root: Document | HTMLElement;\n\n /** クリックデリゲータ */\n private readonly onClick = (event: Event) => this.delegate(event, 'click');\n\n /** 変更デリゲータ */\n private readonly onChange = (event: Event) => this.delegate(event, 'change');\n\n /** ロードデリゲータ(キャプチャで拾う) */\n private readonly onLoadCapture = (event: Event) =>\n this.delegate(event, 'load');\n\n /** ページ全体のロード完了時の処理 */\n private readonly onWindowLoad = () => {\n // ページロード時にも load を1回ディスパッチ\n const html = document.documentElement;\n const fragment = Fragment.get(html);\n if (fragment) {\n void new Procedure(fragment, 'load').run();\n }\n };\n\n /**\n * popstate デリゲータ(Haori が管理する履歴に戻った場合だけページをリロード)。\n *\n * @param event popstate イベント\n */\n private readonly onPopstate = (event: PopStateEvent) => {\n const state = event.state as Record<string, unknown> | null;\n if (!state || state[EventDispatcher.HISTORY_STATE_KEY] !== true) {\n return;\n }\n location.reload();\n };\n\n /**\n * コンストラクタ。\n *\n * @param root 監視対象のルート要素(デフォルトは document )\n */\n constructor(root: Document | HTMLElement = document) {\n this.root = root;\n }\n\n /**\n * イベントリスナーの登録を開始します。\n * クリック、変更、ロード、popstate イベントを監視し、対応するProcedureを実行します。\n */\n start(): void {\n this.root.addEventListener('click', this.onClick);\n this.root.addEventListener('change', this.onChange);\n // load は非バブルなのでキャプチャで拾う\n this.root.addEventListener('load', this.onLoadCapture, true);\n // ページ全体のロード\n window.addEventListener('load', this.onWindowLoad, {once: true});\n // ブラウザの戻る・進む操作\n window.addEventListener('popstate', this.onPopstate);\n }\n\n /**\n * イベントリスナーの登録を停止します。\n */\n stop(): void {\n this.root.removeEventListener('click', this.onClick);\n this.root.removeEventListener('change', this.onChange);\n this.root.removeEventListener('load', this.onLoadCapture, true);\n window.removeEventListener('load', this.onWindowLoad);\n window.removeEventListener('popstate', this.onPopstate);\n }\n\n /**\n * イベントを処理し、対応するProcedureを実行します。\n *\n * @param event 発生したイベント\n * @param type イベントタイプ('click', 'change', 'load'など)\n */\n private delegate(event: Event, type: string) {\n const element = this.getElementFromTarget(event.target, type);\n if (!element) {\n return;\n }\n const fragment = Fragment.get(element);\n if (!fragment) {\n return;\n }\n\n // changeイベントの場合、DOM値と同期\n if (type === 'change' && fragment instanceof ElementFragment) {\n fragment.syncValue();\n }\n\n new Procedure(fragment, type).run().catch(error => {\n Log.error('[Haori]', 'Procedure execution error:', error);\n });\n }\n\n /**\n * イベントのターゲットから HTMLElement を取得します。\n *\n * @param target イベントのターゲット\n * @param type イベントタイプ。click の場合のみ祖先委譲を行う\n * @returns HTMLElement または null\n */\n private getElementFromTarget(\n target: EventTarget | null,\n type: string | null,\n ): HTMLElement | null {\n if (!target) {\n return null;\n }\n if (target instanceof HTMLElement) {\n if (type === 'click') {\n return this.findClickableElement(target);\n }\n return target;\n }\n if (target instanceof Node) {\n const element = target.parentElement;\n if (!element) {\n return null;\n }\n if (type === 'click') {\n return this.findClickableElement(element);\n }\n return element;\n }\n return null;\n }\n\n /**\n * data-click-* 属性を持つ最も近い祖先要素を返します。\n *\n * @param element 探索開始要素\n * @returns 処理対象要素。見つからない場合は null\n */\n private findClickableElement(element: HTMLElement): HTMLElement | null {\n let current: HTMLElement | null = element;\n while (current) {\n if (\n current.getAttributeNames().some(name => name.startsWith('data-click-'))\n ) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n }\n}\n","/**\n * @fileoverview IntersectionObserver based trigger dispatcher.\n */\n\nimport Env from './env';\nimport Fragment, {ElementFragment} from './fragment';\nimport Log from './log';\nimport Procedure from './procedure';\n\ninterface IntersectRegistration {\n fragment: ElementFragment;\n observer: IntersectionObserver;\n once: boolean;\n running: boolean;\n}\n\n/**\n * `data-intersect-*` 属性を監視し、交差時に Procedure を実行します。\n */\nexport default class IntersectObserver {\n private static readonly CONFIG_KEYS = new Set([\n 'root',\n 'root-margin',\n 'threshold',\n 'disabled',\n 'once',\n ]);\n\n private static readonly registrations = new Map<\n HTMLElement,\n IntersectRegistration\n >();\n\n /**\n * ノードが現在の Window に属する HTMLElement かどうかを判定します。\n *\n * @param node 判定対象ノード\n * @returns HTMLElement の場合は true\n */\n private static isHtmlElement(node: unknown): node is HTMLElement {\n if (!(node instanceof Element)) {\n return false;\n }\n const ctor = node.ownerDocument?.defaultView?.HTMLElement;\n return typeof ctor !== 'undefined' && node instanceof ctor;\n }\n\n public static syncTree(root: Node): void {\n if (!(root instanceof Element || root instanceof DocumentFragment)) {\n return;\n }\n if (IntersectObserver.isHtmlElement(root)) {\n IntersectObserver.syncElement(root);\n }\n root.querySelectorAll<HTMLElement>('*').forEach(element => {\n IntersectObserver.syncElement(element);\n });\n }\n\n public static syncElement(element: HTMLElement): void {\n const registration = IntersectObserver.registrations.get(element);\n const fragment = Fragment.get(element);\n if (!fragment || !IntersectObserver.shouldObserve(fragment)) {\n if (registration) {\n registration.observer.disconnect();\n IntersectObserver.registrations.delete(element);\n }\n return;\n }\n\n if (typeof IntersectionObserver === 'undefined') {\n return;\n }\n\n const nextRoot = IntersectObserver.resolveRoot(fragment);\n const nextRootMargin = IntersectObserver.resolveRootMargin(fragment);\n const nextThreshold = IntersectObserver.resolveThreshold(fragment);\n const nextOnce = fragment.hasAttribute(`${Env.prefix}intersect-once`);\n\n if (\n registration &&\n registration.observer.root === nextRoot &&\n registration.observer.rootMargin === nextRootMargin &&\n IntersectObserver.sameThreshold(\n registration.observer.thresholds,\n nextThreshold,\n ) &&\n registration.once === nextOnce\n ) {\n registration.fragment = fragment;\n return;\n }\n\n if (registration) {\n registration.observer.disconnect();\n IntersectObserver.registrations.delete(element);\n }\n\n const observer = new IntersectionObserver(\n entries => {\n const current = IntersectObserver.registrations.get(element);\n if (!current) {\n return;\n }\n entries.forEach(entry => {\n if (!entry.isIntersecting || current.running) {\n return;\n }\n if (IntersectObserver.isDisabled(current.fragment)) {\n return;\n }\n current.running = true;\n void new Procedure(current.fragment, 'intersect')\n .runWithResult()\n .then(success => {\n if (success && current.once) {\n current.observer.disconnect();\n IntersectObserver.registrations.delete(element);\n }\n })\n .catch(error => {\n Log.error(\n '[Haori]',\n 'Intersect procedure execution error:',\n error,\n );\n })\n .finally(() => {\n const latest = IntersectObserver.registrations.get(element);\n if (latest) {\n latest.running = false;\n }\n });\n });\n },\n {\n root: nextRoot,\n rootMargin: nextRootMargin,\n threshold: nextThreshold,\n },\n );\n\n observer.observe(element);\n IntersectObserver.registrations.set(element, {\n fragment,\n observer,\n once: nextOnce,\n running: false,\n });\n }\n\n public static cleanupTree(root: Node): void {\n if (IntersectObserver.isHtmlElement(root)) {\n const registration = IntersectObserver.registrations.get(root);\n if (registration) {\n registration.observer.disconnect();\n IntersectObserver.registrations.delete(root);\n }\n }\n if (!(root instanceof Element || root instanceof DocumentFragment)) {\n return;\n }\n root.querySelectorAll<HTMLElement>('*').forEach(element => {\n const registration = IntersectObserver.registrations.get(element);\n if (registration) {\n registration.observer.disconnect();\n IntersectObserver.registrations.delete(element);\n }\n });\n }\n\n public static disconnectAll(): void {\n IntersectObserver.registrations.forEach(registration => {\n registration.observer.disconnect();\n });\n IntersectObserver.registrations.clear();\n }\n\n private static shouldObserve(fragment: ElementFragment): boolean {\n return fragment.getAttributeNames().some(name => {\n if (!name.startsWith(`${Env.prefix}intersect-`)) {\n return false;\n }\n const key = name.slice(`${Env.prefix}intersect-`.length);\n return !IntersectObserver.CONFIG_KEYS.has(key);\n });\n }\n\n private static resolveRoot(fragment: ElementFragment): HTMLElement | null {\n const attrName = `${Env.prefix}intersect-root`;\n if (!fragment.hasAttribute(attrName)) {\n return null;\n }\n const selector = fragment.getAttribute(attrName);\n if (typeof selector !== 'string' || selector.trim() === '') {\n return null;\n }\n const root = document.querySelector(selector);\n if (IntersectObserver.isHtmlElement(root)) {\n return root;\n }\n Log.error('[Haori]', `Intersect root element not found: ${selector}`);\n return null;\n }\n\n private static resolveRootMargin(fragment: ElementFragment): string {\n const attrName = `${Env.prefix}intersect-root-margin`;\n const value = fragment.getAttribute(attrName);\n if (value === null || value === false || value === '') {\n return '0px';\n }\n return String(value);\n }\n\n private static resolveThreshold(fragment: ElementFragment): number {\n const attrName = `${Env.prefix}intersect-threshold`;\n const value = fragment.getAttribute(attrName);\n const threshold =\n typeof value === 'number' ? value : Number.parseFloat(String(value ?? 0));\n if (Number.isNaN(threshold)) {\n return 0;\n }\n return Math.min(1, Math.max(0, threshold));\n }\n\n private static isDisabled(fragment: ElementFragment): boolean {\n const attrName = `${Env.prefix}intersect-disabled`;\n const value = fragment.getAttribute(attrName);\n if (value === null || value === false) {\n return false;\n }\n if (typeof value === 'boolean') {\n return value;\n }\n const stringValue = String(value).trim().toLowerCase();\n return stringValue !== '' && stringValue !== 'false' && stringValue !== '0';\n }\n\n private static sameThreshold(\n thresholds: readonly number[],\n threshold: number,\n ): boolean {\n return thresholds.length === 1 && thresholds[0] === threshold;\n }\n}\n","/**\n * @fileoverview 監視機能\n *\n * Observerクラスは、DOMの変更を監視し、バインディングの更新を行います。\n * MutationObserverを使用して、属性の変更、ノードの追加・削除、テキストノードの変更を監視します。\n */\nimport Core from './core';\nimport EventDispatcher from './event_dispatcher';\nimport IntersectObserver from './intersect';\nimport Log from './log';\nimport Queue from './queue';\n\n/**\n * 監視対象の要素を管理するためのクラスです。\n */\nexport class Observer {\n private static _initialized = false;\n\n /** 稼働中の MutationObserver 一覧 */\n private static readonly _mutationObservers: MutationObserver[] = [];\n\n /**\n * 既存の MutationObserver をすべて停止します。\n */\n private static disconnectMutationObservers(): void {\n Observer._mutationObservers.forEach(observer => {\n observer.disconnect();\n });\n Observer._mutationObservers.length = 0;\n }\n\n /**\n * 初期化メソッド。\n * ドキュメントのheadとbodyを監視対象として設定します。\n */\n public static async init() {\n if (Observer._initialized) {\n return;\n }\n Observer._initialized = true;\n Observer.disconnectMutationObservers();\n const results = await Promise.allSettled([\n Core.scan(document.head),\n Core.scan(document.body),\n ]);\n const [headResult, bodyResult] = results;\n if (headResult.status !== 'fulfilled') {\n Log.error('[Haori]', 'Failed to build head fragment:', headResult.reason);\n }\n if (bodyResult.status !== 'fulfilled') {\n Log.error('[Haori]', 'Failed to build body fragment:', bodyResult.reason);\n }\n await Queue.wait();\n document.body.setAttribute('data-haori-ready', '');\n Observer.observe(document.head);\n Observer.observe(document.body);\n new EventDispatcher().start();\n IntersectObserver.syncTree(document.body);\n }\n\n /**\n * 指定された要素を監視します。\n *\n * @param root 監視対象の要素\n */\n public static observe(root: HTMLElement | Document) {\n const observer = new MutationObserver(async mutations => {\n for (const mutation of mutations) {\n try {\n switch (mutation.type) {\n case 'attributes': {\n const element = mutation.target as HTMLElement;\n if (\n mutation.attributeName &&\n element.hasAttribute('data-haori-click-lock') &&\n (mutation.attributeName === 'disabled' ||\n mutation.attributeName === 'data-haori-click-lock')\n ) {\n break;\n }\n if (\n mutation.attributeName &&\n Core.isAliasedAttributeReflection(\n element,\n mutation.attributeName,\n )\n ) {\n break;\n }\n Core.setAttribute(\n element,\n mutation.attributeName!,\n element.getAttribute(mutation.attributeName!),\n true,\n );\n IntersectObserver.syncElement(element);\n break;\n }\n case 'childList': {\n Array.from(mutation.removedNodes).forEach(node => {\n IntersectObserver.cleanupTree(node);\n Core.removeNode(node);\n });\n Array.from(mutation.addedNodes).forEach(node => {\n if (!(node.parentElement instanceof Element)) {\n return;\n }\n Core.addNode(node.parentElement, node);\n IntersectObserver.syncTree(node);\n });\n break;\n }\n case 'characterData': {\n if (\n mutation.target instanceof Text ||\n mutation.target instanceof Comment\n ) {\n Core.changeText(mutation.target, mutation.target.textContent!);\n } else {\n Log.warn(\n '[Haori]',\n 'Unsupported character data type:',\n mutation.target,\n );\n }\n break;\n }\n default:\n Log.warn('[Haori]', 'Unknown mutation type:', mutation.type);\n continue;\n }\n } catch (error) {\n Log.error('[Haori]', 'Error processing mutation:', error);\n }\n }\n });\n\n observer.observe(root, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n });\n Observer._mutationObservers.push(observer);\n }\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', Observer.init);\n} else {\n Observer.init();\n}\n","/**\n * @fileoverview Haori-js メインエントリーポイント\n *\n * Haori-jsライブラリのすべての機能を提供するメインファイルです。\n */\n\nimport Core from './core';\nimport Env from './env';\nimport Fragment from './fragment';\nimport Form from './form';\nimport Haori from './haori';\nimport Log from './log';\nimport Queue from './queue';\n// ブラウザ運用時の監視・自動起動(本番動作)は observer モジュールが担います\nimport './observer';\n\n// メインクラスとユーティリティをエクスポート\nexport {Core, Env, Fragment, Form, Haori, Log, Queue};\nexport type {HaoriRuntime} from './env';\n\n// デフォルトエクスポート(Haoriをメインとして提供)\nexport default Haori;\n\n// バージョン情報\nexport const version = '0.4.13';\n"],"names":["_Dev","enabled","Dev","DEFAULT_RUNTIME","isHaoriRuntime","runtime","resolveRuntimeAttribute","_Env","currentScript","prefix","host","Env","Log","message","args","_Expression","scope","candidates","value","bindKeys","bindKeySet","name","expression","bindedValues","forbiddenBindingValues","runtimeBindings","allowMissingIdentifierRecovery","recoveryCount","setup","argValues","wrappedValues","key","error","missingIdentifier","cacheKey","evaluator","assignments","body","identifier","pattern","tokens","groups","previous","index","token","next","activeGroup","beforePrevious","thirdPrevious","group","operators","singleCharacters","current","stringToken","operator","item","numberToken","identifierToken","start","quote","literal","_","code","escaped","cache","target","cachedValue","proxy","currentTarget","property","receiver","result","thisArg","argArray","newTarget","prototype","callback","originals","descriptor","obj","seen","cached","Expression","AsyncQueue","task","prepend","resolve","reject","promise","res","rej","promises","_Queue","Queue","Haori","level","toast","element","recipient","parent","FORM_HAORI_METHOD_NAMES","resolveFormHaoriApi","candidate","methodName","Form","form","values","fragment","objectName","listName","child","childValues","childList","force","emitEvents","detach","children","i","Core","tasks","removeClones","f","isBefore","isAfter","processChildren","activeHaori","addMsgFn","doAdd","targetFragments","targetFragment","parts","results","firstPoint","lastPoint","rawKey","indexString","rows","_EvaluationProfileRegistry","elementId","store","counter","left","right","childIndex","leftCalls","sum","context","expressions","totalDurationMs","globalRecord","existing","counters","template","placeholders","placeholder","startedAt","segments","segment","rawId","deriveName","EvaluationProfileRegistry","_Fragment","node","ElementFragment","TextFragment","CommentFragment","prevSkip","mounted","unmount","Fragment","_ElementFragment","contents","AttributeContents","childFragment","clone","childClone","data","signature","skippable","dispatchEvents","isBooleanCheckbox","newChecked","fromObserver","rawName","targetName","syncValueProperty","detail","hasTemplateExpression","isBooleanAttribute","isSingleExpression","joinedValue","TextContents","evaluatedValue","shouldRemoveTarget","shouldSyncValueProperty","stringResult","requiresRawAttributeWrite","requiresTargetAttributeWrite","requiresValuePropertyWrite","referenceChild","insertAfter","referenceNode","insertionReferenceNode","nextTrackedNode","newChild","referenceNodeOverride","ancestors","ancestor","isSameParent","newChildIndex","referenceIndex","newChildParent","insertionPoint","siblings","text","nextText","currentText","_TextContents","matches","lastIndex","hasEvaluate","hasRawEvaluate","match","content","c","bindingValues","profileContext","shouldEvaluate","errorKind","profileExpressions","hasUnresolvedReference","measured","_AttributeContents","HaoriEvent","eventName","options","event","version","url","bytes","reason","changedKeys","prevKeys","nextKeys","allKeys","prevValue","nextValue","added","removed","order","from","to","payload","metadata","status","PROCEDURE_HAORI_METHOD_NAMES","PROCEDURE_HISTORY_STATE_KEY","PROCEDURE_CLICK_LOCK_MARKER","resolveProcedureHaoriApi","QUERY_TRANSPORT_METHODS","isQueryTransportMethod","method","appendPayloadToSearchParams","params","appendPayloadToUrl","fetchUrl","normalizeRequestBody","buildFetchSignature","headers","normalizedHeaders","a","b","_Procedure","hasFetchFallback","rawAttribute","_matched","rawExpression","source","offset","inString","char","attrName","attributeEvaluation","dataAttribute","trimmed","resolved","formSelector","formElement","e","fetchAttrName","hasFetchAttr","fetchEvaluation","fetchOptions","fetchMethodAttrEvent","fetchMethodEvaluation","fetchMethodAttrNonEvent","fetchHeadersAttrEvent","headersString","fetchHeadersAttrNonEvent","fetchCTAttrEvent","fetchContentTypeEvaluation","hasContentType","fetchCTAttrNonEvent","bindAttr","bindSelector","bindElements","bindArgAttrEvent","bindArgAttrNonEventLegacy","bindArgAttrNonEventNew","bindParamsAttr","paramsString","p","bindAppendAttr","copyParamsAttr","param","adjustSelector","adjustElements","valueString","rawLevel","isValidLevel","historyFormSelector","historyFormElement","attrKey","selector","list","el","frag","arg1","arg2","executionLock","preparedRequest","hasPayload","finalOptions","requestedMethod","isDemoQueryNormalization","queryString","fetchStartMetadata","response","formFragment","skipFragments","bindingData","merged","deferredPromises","hasHistoryUrl","historyDataValues","historyFormValues","hasHistoryData","hasHistoryForm","baseUrlString","errorMessage","appendParams","k","v","baseFragment","addGeneralMessage","targetEl","scrollToFirstError","root","entries","m","firstInvalid","found","newData","bindArg","currentValue","currentObject","resolvedData","currentData","incoming","sourceData","copyData","payloadResolution","contentType","formData","includeParams","excludeParams","trimmedParam","excludedParam","filtered","adjustValue","rowFragment","newFragment","prevFragment","nextFragment","Procedure","Url","Import","init","doc","_Core","suffix","aliasPrefix","chain","rawValue","state","importEvaluation","resolvedUrl","html","childPromises","stopAtEach","attributeChain","processedAttributes","condition","aliasedAttributeName","deriveChangedPromise","nextDeriveInputSignature","arg","changed","formValues","parentElement","hasDerive","hasIf","hasEach","deriveExpression","shouldSkipDerivedSubtree","shouldRecordDerivedSubtreeSignature","nextDerivedSubtreeSignature","previousDerivedBindingData","normalizedName","nextDerivedBindingData","keyArg","nextEachInputSignature","templateTarget","evaluation","profile","siblingIndex","allowedEachAttributes","hasDynamicAttributes","hasDynamicChildren","newList","indexKey","itemArg","keyDataMap","newKeys","itemIndex","listKey","newKeySet","removalPromises","childElements","previousKeys","srcKeys","childElementsByKey","insertTargets","baseInsertIndex","newKey","loopIndex","reusedChild","currentInsertIndex","validNewKeys","validSrcKeys","validSrcKeySet","addedKeys","removedKeys","normalizedBindingData","nextRenderSignature","stack","nextId","marker","record","_EventDispatcher","type","EventDispatcher","_IntersectObserver","ctor","registration","nextRoot","nextRootMargin","nextThreshold","nextOnce","observer","entry","success","latest","threshold","stringValue","thresholds","IntersectObserver","_Observer","headResult","bodyResult","mutations","mutation","Observer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"haori.es.js","sources":["../src/dev.ts","../src/env.ts","../src/log.ts","../src/expression.ts","../src/queue.ts","../src/haori.ts","../src/form.ts","../src/fragment.ts","../src/event.ts","../src/procedure.ts","../src/url.ts","../src/import.ts","../src/core.ts","../src/event_dispatcher.ts","../src/intersect.ts","../src/observer.ts","../src/index.ts"],"sourcesContent":["/**\n * @fileoverview Haori開発モード管理機能\n *\n * 開発モードの有効/無効を管理し、デバッグ機能の制御を行います。\n * プロダクション環境では開発向け機能を無効化することで、\n * パフォーマンスとセキュリティを向上させます。\n */\n\n/**\n * 開発モード管理クラスです。\n */\nexport default class Dev {\n /** 開発モードフラグ */\n private static devMode = false;\n\n /**\n * 開発モードの状態を取得します。\n *\n * @returns 開発モードならtrue、そうでなければfalse\n */\n static isEnabled(): boolean {\n return Dev.devMode;\n }\n\n /**\n * 開発モードを有効化します。\n */\n static enable(): void {\n Dev.devMode = true;\n }\n\n /**\n * 開発モードを無効化します。\n */\n static disable(): void {\n Dev.devMode = false;\n }\n\n /**\n * 開発モードを切り替えます。\n *\n * @param enabled trueで有効化、falseで無効化\n */\n static set(enabled: boolean): void {\n Dev.devMode = enabled;\n }\n}\n","/**\n * @fileoverview Haori環境検出機能\n *\n * 実行環境を管理します。\n */\n\nimport Dev from './dev';\n\n/**\n * Haori.js の実行モードを表します。\n */\nexport type HaoriRuntime = 'embedded' | 'demo';\n\nconst DEFAULT_RUNTIME: HaoriRuntime = 'embedded';\n\n/**\n * 指定文字列が有効な実行モードかどうかを判定します。\n *\n * @param runtime 判定対象の文字列。\n * @return 有効な実行モードなら true。\n */\nfunction isHaoriRuntime(runtime: string): runtime is HaoriRuntime {\n return runtime === 'embedded' || runtime === 'demo';\n}\n\n/**\n * data-runtime 属性値を実行モードへ正規化します。\n *\n * @param runtime 属性から取得した値。\n * @return 有効な実行モード。属性が未設定なら null、無効値なら embedded。\n */\nfunction resolveRuntimeAttribute(runtime: string | null): HaoriRuntime | null {\n if (runtime === null) {\n return null;\n }\n\n return isHaoriRuntime(runtime) ? runtime : DEFAULT_RUNTIME;\n}\n\n/**\n * 実行環境を管理するクラスです。\n */\nexport default class Env {\n private static _prefix: string = 'data-';\n private static _runtime: HaoriRuntime = DEFAULT_RUNTIME;\n\n /**\n * 実行モードを取得します。\n *\n * @returns 実行モード。\n */\n public static get runtime(): HaoriRuntime {\n return Env._runtime;\n }\n\n /**\n * 実行モードを設定します。\n *\n * @param runtime 設定する実行モード。\n * @return 戻り値はありません。\n */\n public static setRuntime(runtime: string): void {\n Env._runtime = isHaoriRuntime(runtime) ? runtime : DEFAULT_RUNTIME;\n }\n\n /**\n * 実行環境からプレフィックスと開発モードかどうかを自動検出します。\n * scriptタグにdata-prefixがある場合は、その値+\"-\"をプレフィックスとして使用します。\n * scriptタグにdata-dev属性がある場合、\n * もしくはローカルホスト系ドメインであれば開発モードを有効化します。\n */\n static detect(): void {\n try {\n const currentScript =\n document.currentScript ||\n document.querySelector('script[src*=\"haori\"]');\n if (currentScript instanceof HTMLScriptElement) {\n const prefix = currentScript.getAttribute('data-prefix') || Env._prefix;\n Env._prefix = prefix.endsWith('-') ? prefix : prefix + '-';\n\n const runtime = resolveRuntimeAttribute(\n currentScript.getAttribute('data-runtime'),\n );\n if (runtime !== null) {\n Env._runtime = runtime;\n }\n }\n if (\n currentScript instanceof HTMLScriptElement &&\n currentScript.hasAttribute(`${Env._prefix}dev`)\n ) {\n Dev.set(true);\n return;\n }\n\n // ローカルホスト系ドメインの場合\n const host = window.location.hostname;\n if (\n host === 'localhost' ||\n host.endsWith('.localhost') ||\n host === '127.0.0.1' ||\n host === '::1' ||\n host.endsWith('.local')\n ) {\n Dev.set(true);\n return;\n }\n\n // それ以外は開発モードを無効化\n Dev.set(false);\n } catch {\n // SSRや非ブラウザ環境では無視\n }\n }\n\n /**\n * プレフィックスを取得します。\n *\n * @returns プレフィックス\n */\n public static get prefix(): string {\n return Env._prefix;\n }\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', Env.detect);\n} else {\n Env.detect();\n}\n","/**\n * @fileoverview Haori共通ログ機能\n *\n * 開発モード時のみログ出力を行います。\n */\n\nimport Dev from './dev';\n\n/**\n * ログ出力を管理するクラス\n */\nexport default class Log {\n /**\n * 開発モードでのみコンソールに情報を出力します。\n *\n * @param message 出力するメッセージ\n * @param args 追加の引数\n */\n static info(message: string, ...args: unknown[]): void {\n if (Dev.isEnabled() && console.log) {\n console.log(message, ...args);\n }\n }\n\n /**\n * 開発モードでのみコンソールに警告を出力します。\n *\n * @param message 出力するメッセージ\n * @param args 追加の引数\n */\n static warn(message: string, ...args: unknown[]): void {\n if (Dev.isEnabled() && console.warn) {\n console.warn(message, ...args);\n }\n }\n\n /**\n * モードに関係なくコンソールにエラーを出力します。\n *\n * @param message 出力するメッセージ\n * @param args 追加の引数\n */\n static error(message: string, ...args: unknown[]): void {\n console.error(message, ...args);\n }\n}\n","/**\n * @fileoverview 式評価エンジン\n *\n * 式評価システムです。\n * XSS攻撃やコードインジェクションを防ぐためのセキュリティ機能と、\n * パフォーマンス向上のためのキャッシュ機能を提供します。\n */\n\nimport Log from './log';\n\n/**\n * 式評価結果の詳細です。\n */\nexport interface ExpressionEvaluationDetail {\n /** 評価結果 */\n value: unknown;\n\n /** 未解決参照が含まれていたかどうか */\n unresolvedReference: boolean;\n}\n\ntype ExpressionTokenType = 'identifier' | 'number' | 'string' | 'operator';\n\ninterface ExpressionToken {\n type: ExpressionTokenType;\n value: string;\n position: number;\n}\n\ninterface ExpressionEvaluatorSetup {\n bindKeys: string[];\n evaluator: ((...args: unknown[]) => unknown) | null;\n compileFailed: boolean;\n}\n\ntype GroupContext = 'paren' | 'array' | 'member' | 'object';\n\nexport default class Expression {\n /** 未宣言識別子の自動補完を試みる最大回数 */\n private static readonly MAX_IDENTIFIER_RECOVERY_COUNT = 8;\n\n /** 危険値チェック結果の短命キャッシュ */\n private static forbiddenBindingValueCache = new WeakMap<object, boolean>();\n\n /** 危険値チェックキャッシュのクリア予約済みフラグ */\n private static forbiddenBindingValueCacheResetScheduled = false;\n\n /** Haoriで禁止すべき識別子一覧(eval と arguments は strict モードで無効化) */\n private static readonly FORBIDDEN_NAMES = [\n // グローバルオブジェクト\n 'window',\n 'self',\n 'globalThis',\n 'frames',\n 'parent',\n 'top',\n // 危険な関数/オブジェクト\n 'Function',\n 'setTimeout',\n 'setInterval',\n 'requestAnimationFrame',\n 'alert',\n 'confirm',\n 'prompt',\n 'fetch',\n 'XMLHttpRequest',\n 'Reflect',\n // 脱出経路・プロトタイプ\n 'constructor',\n '__proto__',\n 'prototype',\n 'Object',\n // その他\n 'document',\n 'location',\n 'navigator',\n 'localStorage',\n 'sessionStorage',\n 'IndexedDB',\n 'history',\n ];\n\n /** strict モードで禁止される識別子 */\n private static readonly STRICT_FORBIDDEN_NAMES = ['eval', 'arguments'];\n\n /** 明示バインド時のみ利用を許可する衝突名 */\n private static readonly REBINDABLE_FORBIDDEN_NAMES = new Set(['location']);\n\n /** バインド識別子としては拒否する名前 */\n private static readonly FORBIDDEN_BINDING_NAMES = new Set([\n ...Expression.FORBIDDEN_NAMES.filter(\n name => !Expression.REBINDABLE_FORBIDDEN_NAMES.has(name),\n ),\n 'constructor',\n '__proto__',\n 'prototype',\n ...Expression.STRICT_FORBIDDEN_NAMES,\n ]);\n\n /**\n * 明示バインド内に持ち込まれてはならない危険値を返します。\n *\n * @returns 危険値の配列\n */\n private static getForbiddenBindingValues(): unknown[] {\n const scope = globalThis as typeof globalThis & {\n window?: Window;\n document?: Document;\n navigator?: Navigator;\n history?: History;\n localStorage?: Storage;\n sessionStorage?: Storage;\n fetch?: typeof fetch;\n };\n const candidates: unknown[] = [\n scope,\n scope.window,\n scope.document,\n scope.navigator,\n scope.history,\n scope.localStorage,\n scope.sessionStorage,\n scope.fetch,\n scope.Function,\n scope.setTimeout,\n scope.setInterval,\n scope.requestAnimationFrame,\n scope.alert,\n scope.confirm,\n scope.prompt,\n ];\n if (scope.window?.location) {\n candidates.push(scope.window.location);\n }\n return candidates.filter(value => value !== undefined && value !== null);\n }\n\n /**\n * 現在の評価サイクルで利用する危険値集合を返します。\n *\n * @returns 危険値の集合\n */\n private static getForbiddenBindingValueSet(): ReadonlySet<unknown> {\n return new Set(this.getForbiddenBindingValues());\n }\n\n /**\n * 危険値チェック用の短命キャッシュを次の microtask で破棄します。\n */\n private static scheduleForbiddenBindingValueCacheReset(): void {\n if (this.forbiddenBindingValueCacheResetScheduled) {\n return;\n }\n this.forbiddenBindingValueCacheResetScheduled = true;\n queueMicrotask(() => {\n this.forbiddenBindingValueCache = new WeakMap<object, boolean>();\n this.forbiddenBindingValueCacheResetScheduled = false;\n });\n }\n\n /** プロパティアクセスで拒否する名前 */\n private static readonly FORBIDDEN_PROPERTY_NAMES = new Set([\n 'constructor',\n '__proto__',\n 'prototype',\n ]);\n\n /** object literal のプロパティ定義で前置修飾子として扱う識別子 */\n private static readonly OBJECT_PROPERTY_MODIFIERS = new Set([\n 'get',\n 'set',\n 'async',\n ]);\n\n /** 式構文として許可しない予約語 */\n private static readonly DISALLOWED_KEYWORDS = new Set([\n 'await',\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'let',\n 'new',\n 'return',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n ]);\n\n /** 式 → 評価関数のグローバルキャッシュ */\n private static readonly EXPRESSION_CACHE = new Map<\n string,\n (...args: unknown[]) => unknown\n >();\n\n /**\n * 現在のバインド識別子に含まれない禁止グローバルを遮断するコードを生成します。\n *\n * @param bindKeys 現在の式で利用するバインド識別子一覧\n * @returns 評価前に挿入する初期化コード\n */\n private static buildAssignments(bindKeys: string[]): string {\n const bindKeySet = new Set(bindKeys);\n return this.FORBIDDEN_NAMES.filter(name => !bindKeySet.has(name))\n .map(name => `const ${name} = undefined`)\n .join(';\\n');\n }\n\n /**\n * 式を評価します。\n *\n * @param expression 評価する式文字列\n * @param bindedValue バインドされた値のオブジェクト\n */\n public static evaluate(\n expression: string,\n bindedValues: Record<string, unknown> = {},\n ): unknown {\n return this.evaluateDetailed(expression, bindedValues).value;\n }\n\n /**\n * 式を評価し、未解決参照の有無を含む詳細結果を返します。\n *\n * @param expression 評価する式文字列\n * @param bindedValues バインドされた値のオブジェクト\n * @returns 評価結果と未解決参照の有無\n */\n public static evaluateDetailed(\n expression: string,\n bindedValues: Record<string, unknown> = {},\n ): ExpressionEvaluationDetail {\n this.scheduleForbiddenBindingValueCacheReset();\n if (expression.trim() === '') {\n Log.warn('[Haori]', expression, 'Expression is empty');\n return {value: null, unresolvedReference: false};\n }\n if (this.containsDangerousPatterns(expression)) {\n Log.warn('[Haori]', expression, 'Expression contains dangerous patterns');\n return {value: null, unresolvedReference: false};\n }\n if (this.containsForbiddenKeys(bindedValues)) {\n Log.warn('[Haori]', bindedValues, 'Binded values contain forbidden keys');\n return {value: null, unresolvedReference: false};\n }\n const forbiddenBindingValues = this.getForbiddenBindingValueSet();\n if (\n this.containsForbiddenBindingValues(\n bindedValues,\n new WeakSet(),\n forbiddenBindingValues,\n )\n ) {\n Log.warn(\n '[Haori]',\n bindedValues,\n 'Binded values contain forbidden values',\n );\n return {value: null, unresolvedReference: false};\n }\n\n const runtimeBindings = {...bindedValues};\n const allowMissingIdentifierRecovery =\n this.canAttemptMissingIdentifierRecovery(expression);\n\n for (\n let recoveryCount = 0;\n recoveryCount <= this.MAX_IDENTIFIER_RECOVERY_COUNT;\n recoveryCount += 1\n ) {\n const setup = this.prepareEvaluator(expression, runtimeBindings);\n if (setup.compileFailed || setup.evaluator === null) {\n return {value: null, unresolvedReference: false};\n }\n try {\n const argValues: unknown[] = [];\n const wrappedValues = this.wrapBoundValues(runtimeBindings);\n setup.bindKeys.forEach((key: string) => {\n argValues.push(wrappedValues[key]);\n });\n return {\n value: this.withBlockedPropertyAccess(() =>\n setup.evaluator!(...argValues),\n ),\n unresolvedReference: false,\n };\n } catch (error) {\n if (allowMissingIdentifierRecovery && error instanceof ReferenceError) {\n const missingIdentifier = this.extractMissingIdentifier(error);\n if (\n missingIdentifier !== null &&\n this.canRecoverMissingIdentifier(missingIdentifier, runtimeBindings)\n ) {\n runtimeBindings[missingIdentifier] = undefined;\n continue;\n }\n }\n Log.error('[Haori]', 'Expression evaluation error:', expression, error);\n if (error instanceof ReferenceError) {\n // ReferenceError(未定義変数)はundefinedを返す\n return {value: undefined, unresolvedReference: true};\n }\n return {value: null, unresolvedReference: false};\n }\n }\n\n Log.error(\n '[Haori]',\n 'Failed to recover missing identifiers:',\n expression,\n runtimeBindings,\n );\n return {value: undefined, unresolvedReference: true};\n }\n\n /**\n * 現在のバインド集合で evaluator を取得または生成します。\n *\n * @param expression 評価する式\n * @param bindedValues バインドされた値のオブジェクト\n * @returns evaluator 準備結果\n */\n private static prepareEvaluator(\n expression: string,\n bindedValues: Record<string, unknown>,\n ): ExpressionEvaluatorSetup {\n const bindKeys = Object.keys(bindedValues)\n .filter(key => !this.FORBIDDEN_BINDING_NAMES.has(key))\n .sort();\n const cacheKey = `${expression}:${bindKeys.join(',')}`;\n\n let evaluator = this.EXPRESSION_CACHE.get(cacheKey) || null;\n if (evaluator !== null) {\n return {\n bindKeys,\n evaluator,\n compileFailed: false,\n };\n }\n\n const assignments = this.buildAssignments(bindKeys);\n const body = assignments\n ? '\"use strict\";\\n' + `${assignments};\\nreturn (${expression});`\n : '\"use strict\";\\n' + `return (${expression});`;\n try {\n evaluator = new Function(...bindKeys, body) as (\n ...args: unknown[]\n ) => unknown;\n this.EXPRESSION_CACHE.set(cacheKey, evaluator);\n return {\n bindKeys,\n evaluator,\n compileFailed: false,\n };\n } catch (error) {\n Log.error(\n '[Haori]',\n 'Failed to compile expression:',\n expression,\n error,\n );\n return {\n bindKeys,\n evaluator: null,\n compileFailed: true,\n };\n }\n }\n\n /**\n * ReferenceError から未宣言識別子名を抽出します。\n *\n * @param error 発生した ReferenceError\n * @returns 識別子名。抽出できない場合は null\n */\n private static extractMissingIdentifier(\n error: ReferenceError,\n ): string | null {\n const message = String(error.message || '');\n const match = message.match(\n /^([A-Za-z_$][A-Za-z0-9_$]*) is not defined$/,\n );\n return match?.[1] || null;\n }\n\n /**\n * 未宣言識別子を undefined バインドとして補完可能かを返します。\n *\n * @param identifier 識別子名\n * @param bindedValues 現在のバインド値\n * @returns 補完可能なら true\n */\n private static canRecoverMissingIdentifier(\n identifier: string,\n bindedValues: Record<string, unknown>,\n ): boolean {\n if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(identifier)) {\n return false;\n }\n return (\n bindedValues[identifier] === undefined &&\n !(identifier in bindedValues)\n );\n }\n\n /**\n * 未宣言識別子の補完を試みてよい式かを返します。\n *\n * @param expression 評価する式\n * @returns 補完を試みてよい場合は true\n */\n private static canAttemptMissingIdentifierRecovery(\n expression: string,\n ): boolean {\n return (\n expression.includes('?.') ||\n expression.includes('??') ||\n expression.includes('||') ||\n expression.includes('&&')\n );\n }\n\n /**\n * 式にevalや危険な構文が含まれているかチェックします。\n *\n * @param expression チェック対象の式文字列\n * @return 危険なパターンが含まれている場合はtrue\n */\n protected static containsDangerousPatterns(expression: string): boolean {\n if (!this.hasAllowedSyntax(expression)) {\n return true;\n }\n const dangerousPatterns = [\n /\\beval\\s*\\(/, // eval(...)\n /\\barguments\\s*\\[/, // arguments[...]\n /\\barguments\\s*\\./, // arguments.xxx\n ];\n return dangerousPatterns.some(pattern => pattern.test(expression));\n }\n\n /**\n * 許可する式構文かどうかを検証します。\n *\n * @param expression 検証対象の式\n * @returns 許可する構文であればtrue\n */\n private static hasAllowedSyntax(expression: string): boolean {\n const tokens = this.tokenizeExpression(expression);\n if (tokens === null || tokens.length === 0) {\n return false;\n }\n\n const groups: GroupContext[] = [];\n let previous: ExpressionToken | null = null;\n\n for (let index = 0; index < tokens.length; index++) {\n const token = tokens[index];\n const next = tokens[index + 1] || null;\n\n const activeGroup = groups[groups.length - 1] || null;\n const beforePrevious = tokens[index - 2] || null;\n const thirdPrevious = tokens[index - 3] || null;\n\n if (\n this.startsObjectKey(\n activeGroup,\n previous,\n beforePrevious,\n thirdPrevious,\n )\n ) {\n if (token.value === '[') {\n return false;\n }\n if (\n token.type === 'identifier' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(token.value)\n ) {\n return false;\n }\n if (\n token.type === 'string' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(\n this.decodeStringLiteral(token.value),\n )\n ) {\n return false;\n }\n }\n\n if (token.type === 'identifier') {\n if (this.DISALLOWED_KEYWORDS.has(token.value)) {\n return false;\n }\n if (this.STRICT_FORBIDDEN_NAMES.includes(token.value)) {\n return false;\n }\n if (\n (previous?.value === '.' || previous?.value === '?.') &&\n this.FORBIDDEN_PROPERTY_NAMES.has(token.value)\n ) {\n return false;\n }\n }\n\n if (activeGroup === 'member' && token.value !== ']') {\n if (\n token.type === 'string' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(\n this.decodeStringLiteral(token.value),\n )\n ) {\n return false;\n }\n }\n\n if (token.value === '.' && next?.type !== 'identifier') {\n return false;\n }\n\n if (\n token.value === '?.' &&\n next?.type !== 'identifier' &&\n next?.value !== '[' &&\n next?.value !== '('\n ) {\n return false;\n }\n\n switch (token.value) {\n case '(':\n groups.push('paren');\n break;\n case ')': {\n const group = groups.pop();\n if (group !== 'paren') {\n return false;\n }\n break;\n }\n case '[': {\n const group: GroupContext = this.startsMemberAccess(previous)\n ? 'member'\n : 'array';\n groups.push(group);\n break;\n }\n case '{':\n groups.push('object');\n break;\n case ']': {\n const group = groups.pop();\n if (group === undefined) {\n return false;\n }\n break;\n }\n case '}': {\n const group = groups.pop();\n if (group !== 'object') {\n return false;\n }\n break;\n }\n }\n\n previous = token;\n }\n\n return groups.length === 0;\n }\n\n /**\n * 式をトークン列に分解します。\n *\n * @param expression 評価前に検証する式\n * @returns 分解結果。未対応構文を含む場合はnull\n */\n private static tokenizeExpression(\n expression: string,\n ): ExpressionToken[] | null {\n const tokens: ExpressionToken[] = [];\n const operators = [\n '===',\n '!==',\n '...',\n '?.',\n '&&',\n '||',\n '>=',\n '<=',\n '==',\n '!=',\n '=>',\n ];\n const singleCharacters = new Set([\n '(',\n ')',\n '{',\n '}',\n '[',\n ']',\n '.',\n ',',\n '?',\n ':',\n '+',\n '-',\n '*',\n '/',\n '%',\n '!',\n '>',\n '<',\n ]);\n let index = 0;\n\n while (index < expression.length) {\n const current = expression[index];\n\n if (/\\s/.test(current)) {\n index += 1;\n continue;\n }\n\n if (\n current === '/' &&\n (expression[index + 1] === '/' || expression[index + 1] === '*')\n ) {\n return null;\n }\n\n if (current === '\"' || current === '\\'') {\n const stringToken = this.readStringToken(expression, index);\n if (stringToken === null) {\n return null;\n }\n tokens.push(stringToken.token);\n index = stringToken.nextIndex;\n continue;\n }\n\n const operator = operators.find(item =>\n expression.startsWith(item, index),\n );\n if (operator) {\n tokens.push({type: 'operator', value: operator, position: index});\n index += operator.length;\n continue;\n }\n\n if (/[0-9]/.test(current)) {\n const numberToken = this.readNumberToken(expression, index);\n tokens.push(numberToken.token);\n index = numberToken.nextIndex;\n continue;\n }\n\n if (/[A-Za-z_$]/.test(current)) {\n const identifierToken = this.readIdentifierToken(expression, index);\n tokens.push(identifierToken.token);\n index = identifierToken.nextIndex;\n continue;\n }\n\n if (singleCharacters.has(current)) {\n tokens.push({type: 'operator', value: current, position: index});\n index += 1;\n continue;\n }\n\n return null;\n }\n\n return tokens;\n }\n\n /**\n * 文字列リテラルを読み取ります。\n *\n * @param expression 式全体\n * @param start 開始位置\n * @returns トークンと次の位置\n */\n private static readStringToken(\n expression: string,\n start: number,\n ): {token: ExpressionToken; nextIndex: number} | null {\n const quote = expression[start];\n let index = start + 1;\n\n while (index < expression.length) {\n const current = expression[index];\n if (current === '\\\\') {\n index += 2;\n continue;\n }\n if (current === quote) {\n return {\n token: {\n type: 'string',\n value: expression.slice(start, index + 1),\n position: start,\n },\n nextIndex: index + 1,\n };\n }\n index += 1;\n }\n\n return null;\n }\n\n /**\n * 数値リテラルを読み取ります。\n *\n * @param expression 式全体\n * @param start 開始位置\n * @returns トークンと次の位置\n */\n private static readNumberToken(\n expression: string,\n start: number,\n ): {token: ExpressionToken; nextIndex: number} {\n let index = start;\n while (index < expression.length && /[0-9_]/.test(expression[index])) {\n index += 1;\n }\n if (expression[index] === '.') {\n index += 1;\n while (index < expression.length && /[0-9_]/.test(expression[index])) {\n index += 1;\n }\n }\n return {\n token: {\n type: 'number',\n value: expression.slice(start, index),\n position: start,\n },\n nextIndex: index,\n };\n }\n\n /**\n * 識別子を読み取ります。\n *\n * @param expression 式全体\n * @param start 開始位置\n * @returns トークンと次の位置\n */\n private static readIdentifierToken(\n expression: string,\n start: number,\n ): {token: ExpressionToken; nextIndex: number} {\n let index = start;\n while (\n index < expression.length &&\n /[A-Za-z0-9_$]/.test(expression[index])\n ) {\n index += 1;\n }\n return {\n token: {\n type: 'identifier',\n value: expression.slice(start, index),\n position: start,\n },\n nextIndex: index,\n };\n }\n\n /**\n * 角括弧がメンバーアクセスかどうかを判定します。\n *\n * @param previous 直前のトークン\n * @returns メンバーアクセスであればtrue\n */\n private static startsMemberAccess(previous: ExpressionToken | null): boolean {\n if (previous === null) {\n return false;\n }\n if (previous.type === 'identifier' || previous.type === 'number') {\n return true;\n }\n return (\n previous.value === ')' ||\n previous.value === ']' ||\n previous.value === '?.'\n );\n }\n\n /**\n * object literal 内で次のトークンがキー位置かどうかを判定します。\n *\n * @param activeGroup 現在のグループ種別\n * @param previous 直前のトークン\n * @returns object literal のキー位置であれば true\n */\n private static startsObjectKey(\n activeGroup: GroupContext | null,\n previous: ExpressionToken | null,\n beforePrevious: ExpressionToken | null,\n thirdPrevious: ExpressionToken | null,\n ): boolean {\n if (activeGroup !== 'object') {\n return false;\n }\n if (previous?.value === '{' || previous?.value === ',') {\n return true;\n }\n\n if (\n previous?.type === 'identifier' &&\n this.OBJECT_PROPERTY_MODIFIERS.has(previous.value) &&\n (beforePrevious?.value === '{' || beforePrevious?.value === ',')\n ) {\n return true;\n }\n\n if (previous?.value !== '*') {\n return false;\n }\n\n if (beforePrevious?.value === '{' || beforePrevious?.value === ',') {\n return true;\n }\n\n return (\n beforePrevious?.type === 'identifier' &&\n beforePrevious.value === 'async' &&\n (thirdPrevious?.value === '{' || thirdPrevious?.value === ',')\n );\n }\n\n /**\n * 文字列リテラルをプレーン文字列へ変換します。\n *\n * @param literal 文字列リテラル\n * @returns デコード後の文字列\n */\n private static decodeStringLiteral(literal: string): string {\n return literal\n .slice(1, -1)\n .replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, (_, code: string) =>\n String.fromCodePoint(parseInt(code, 16)),\n )\n .replace(/\\\\u([0-9a-fA-F]{4})/g, (_, code: string) =>\n String.fromCharCode(parseInt(code, 16)),\n )\n .replace(/\\\\x([0-9a-fA-F]{2})/g, (_, code: string) =>\n String.fromCharCode(parseInt(code, 16)),\n )\n .replace(/\\\\([\"'\\\\bfnrtv0])/g, (_, escaped: string) => {\n switch (escaped) {\n case 'b':\n return '\\b';\n case 'f':\n return '\\f';\n case 'n':\n return '\\n';\n case 'r':\n return '\\r';\n case 't':\n return '\\t';\n case 'v':\n return '\\v';\n case '0':\n return '\\0';\n default:\n return escaped;\n }\n });\n }\n\n /**\n * バインド値を安全なProxyでラップします。\n *\n * @param bindedValues バインド値\n * @returns ラップ済みのバインド値\n */\n private static wrapBoundValues(\n bindedValues: Record<string, unknown>,\n ): Record<string, unknown> {\n const cache = new WeakMap<object, unknown>();\n const wrappedValues: Record<string, unknown> = {};\n\n Object.entries(bindedValues).forEach(([key, value]) => {\n wrappedValues[key] = this.wrapBoundValue(value, cache);\n });\n\n return wrappedValues;\n }\n\n /**\n * 危険なプロパティアクセスを防ぐために値を再帰的にラップします。\n *\n * @param value ラップ対象の値\n * @param cache 既存Proxyのキャッシュ\n * @returns ラップ済みの値\n */\n private static wrapBoundValue(\n value: unknown,\n cache: WeakMap<object, unknown>,\n ): unknown {\n if (!this.shouldWrapValue(value)) {\n return value;\n }\n\n const target = value as object;\n const cachedValue = cache.get(target);\n if (cachedValue !== undefined) {\n return cachedValue;\n }\n\n const proxy = new Proxy(target, {\n get: (currentTarget, property, receiver) => {\n if (\n typeof property === 'string' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(property)\n ) {\n return undefined;\n }\n const result = Reflect.get(currentTarget, property, receiver);\n if (typeof property === 'symbol') {\n return result;\n }\n return this.wrapBoundValue(result, cache);\n },\n has: (currentTarget, property) => {\n if (\n typeof property === 'string' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(property)\n ) {\n return false;\n }\n return Reflect.has(currentTarget, property);\n },\n getOwnPropertyDescriptor: (currentTarget, property) => {\n if (\n typeof property === 'string' &&\n this.FORBIDDEN_PROPERTY_NAMES.has(property)\n ) {\n return undefined;\n }\n return Reflect.getOwnPropertyDescriptor(currentTarget, property);\n },\n apply: (currentTarget, thisArg, argArray) => {\n const result = Reflect.apply(\n currentTarget as (...args: unknown[]) => unknown,\n thisArg,\n argArray,\n );\n if (this.isIteratorLike(result)) {\n return result;\n }\n return this.wrapBoundValue(result, cache);\n },\n construct: (currentTarget, argArray, newTarget) => {\n return this.wrapBoundValue(\n Reflect.construct(\n currentTarget as new (...args: unknown[]) => object,\n argArray,\n newTarget,\n ),\n cache,\n ) as object;\n },\n });\n\n cache.set(target, proxy);\n return proxy;\n }\n\n /**\n * Proxy ラップ対象の値かどうかを判定します。\n *\n * @param value 判定対象\n * @returns ラップ対象であればtrue\n */\n private static shouldWrapValue(value: unknown): value is object {\n if (typeof value === 'function') {\n return true;\n }\n if (value === null || typeof value !== 'object') {\n return false;\n }\n if (Array.isArray(value)) {\n return true;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n }\n\n /**\n * 評価中のみ prototype 系プロパティへの生アクセスを抑止します。\n *\n * @param callback 実行する処理\n * @returns 処理結果\n */\n private static withBlockedPropertyAccess<T>(callback: () => T): T {\n const blockedDescriptors = [\n {target: Object.prototype, property: 'constructor'},\n {target: Function.prototype, property: 'constructor'},\n {target: Object.prototype, property: '__proto__'},\n ] as const;\n const originals = blockedDescriptors\n .map(item => ({\n ...item,\n descriptor: Object.getOwnPropertyDescriptor(item.target, item.property),\n }))\n .filter(item => item.descriptor?.configurable === true);\n\n originals.forEach(({target, property}) => {\n Object.defineProperty(target, property, {\n configurable: true,\n enumerable: false,\n get: () => undefined,\n set: () => undefined,\n });\n });\n\n try {\n return callback();\n } finally {\n originals.forEach(({target, property, descriptor}) => {\n if (descriptor !== undefined) {\n Object.defineProperty(target, property, descriptor);\n }\n });\n }\n }\n\n /**\n * イテレータ互換オブジェクトかどうかを判定します。\n *\n * @param value 判定対象\n * @returns イテレータ互換であればtrue\n */\n private static isIteratorLike(value: unknown): boolean {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n\n return typeof (value as Iterator<unknown>).next === 'function';\n }\n\n /**\n * トップレベルのバインド識別子に拒否対象名が含まれていないかを判定します。\n * ネストしたオブジェクトのプロパティ名は識別子として評価されないため、ここでは拒否しません。\n *\n * @param obj チェック対象のオブジェクト\n * @return 禁止識別子が含まれていればtrue\n */\n protected static containsForbiddenKeys(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n for (const key of Object.keys(obj as object)) {\n if (this.FORBIDDEN_BINDING_NAMES.has(key)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * バインド値に危険なホストオブジェクトやグローバル関数が含まれていないかを再帰的に判定します。\n *\n * @param obj チェック対象の値\n * @param seen 循環参照検出用の訪問済み集合\n * @return 危険値が含まれていればtrue\n */\n protected static containsForbiddenBindingValues(\n obj: unknown,\n seen: WeakSet<object> = new WeakSet<object>(),\n forbiddenBindingValues: ReadonlySet<unknown> =\n this.getForbiddenBindingValueSet(),\n ): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n const cached = this.forbiddenBindingValueCache.get(obj as object);\n if (cached !== undefined) {\n return cached;\n }\n\n if (seen.has(obj as object)) {\n return false;\n }\n seen.add(obj as object);\n\n if (forbiddenBindingValues.has(obj)) {\n this.forbiddenBindingValueCache.set(obj as object, true);\n return true;\n }\n\n for (const value of Object.values(obj as Record<string, unknown>)) {\n if (typeof value === 'function') {\n if (forbiddenBindingValues.has(value)) {\n this.forbiddenBindingValueCache.set(obj as object, true);\n return true;\n }\n continue;\n }\n if (\n this.containsForbiddenBindingValues(value, seen, forbiddenBindingValues)\n ) {\n this.forbiddenBindingValueCache.set(obj as object, true);\n return true;\n }\n }\n\n this.forbiddenBindingValueCache.set(obj as object, false);\n return false;\n }\n}\n","/**\n * @fileoverview 汎用非同期キュー機能\n *\n * 任意の処理を非同期でキューイングし、requestAnimationFrameを使用して順次実行します。\n * 各処理はPromiseを返し、完了時の処理を記述できます。\n * DOM操作などの非同期処理に適しています。\n */\n\nimport Log from './log';\n\n/**\n * キューアイテムの基本構造。\n */\ninterface QueueItem {\n /** 実行する処理 */\n task: () => unknown | Promise<unknown>;\n\n /** 作成時刻 */\n timestamp: number;\n\n /** 完了Promise */\n promise: Promise<unknown>;\n\n /** Promise解決用の関数 */\n resolve: (value: unknown | PromiseLike<unknown>) => void;\n\n /** Promise拒否用の関数 */\n reject: (reason?: unknown) => void;\n}\n\n/**\n * 非同期キュークラス。\n * キュー内の処理を管理し、順次実行します。\n */\nclass AsyncQueue {\n private readonly MAX_BUDGET = 8; // 1フレームあたりの最大処理時間(ms)\n\n /** キュー内の処理 */\n private readonly queue: QueueItem[] = [];\n\n /** 処理中フラグ */\n private processing = false;\n\n /**\n * 処理をキューに追加します\n *\n * @param task 実行する処理\n * @param prepend trueの場合はキューの先頭に追加、falseの場合は末尾に追加\n * @returns 処理完了Promise\n */\n public enqueue(\n task: () => unknown,\n prepend: boolean = false,\n ): Promise<unknown> {\n let resolve: (value: unknown | PromiseLike<unknown>) => void;\n let reject: (reason?: unknown) => void;\n const promise = new Promise<unknown>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const item: QueueItem = {\n task,\n timestamp: performance.now(),\n promise,\n resolve: resolve!,\n reject: reject!,\n };\n if (prepend) {\n this.queue.unshift(item);\n } else {\n this.queue.push(item);\n }\n this.scheduleProcessing();\n return promise;\n }\n\n /**\n * キューを処理します。\n *\n * @returns 処理完了Promise\n */\n private async processQueue(): Promise<void> {\n if (this.processing || this.queue.length === 0) {\n return;\n }\n this.processing = true;\n try {\n const start = performance.now();\n while (this.queue.length > 0) {\n const item = this.queue.shift();\n if (!item) {\n return;\n }\n try {\n const result = await item.task();\n item.resolve(result);\n } catch (error) {\n item.reject(error);\n Log.error('[Haori]', `Task ${item.timestamp} failed:`, error);\n }\n if (performance.now() - start > this.MAX_BUDGET) {\n // 1フレームの処理時間を超えたら一旦終了\n break;\n }\n }\n } catch (error) {\n Log.error('[Haori]', 'Error processing queue:', error);\n } finally {\n this.processing = false;\n if (this.queue.length > 0) {\n this.scheduleProcessing();\n }\n }\n }\n\n /**\n * 処理をスケジュールします。\n */\n private scheduleProcessing(): void {\n if (this.processing) {\n return;\n }\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(() => {\n this.processQueue();\n });\n } else {\n setTimeout(() => {\n this.processQueue();\n }, 16); // 60fps\n }\n }\n\n /**\n * キューが空になるまで待機します。\n *\n * @returns キューが空になったら解決されるPromise\n */\n public async wait(): Promise<void> {\n if (this.queue.length === 0 && !this.processing) {\n return;\n }\n const promises = this.queue.map(item => item.promise);\n if (promises.length > 0) {\n await Promise.allSettled(promises);\n }\n }\n}\n\n/**\n * 非同期キューのデフォルトインスタンス。\n * このインスタンスを使用して、アプリケーション全体でタスクをキューイングできます。\n */\nexport default class Queue {\n /** 非同期キューインスタンス */\n private static readonly ASYNC_QUEUE = new AsyncQueue();\n\n /**\n * タスクをキューに追加します。\n *\n * @param task 実行する処理\n * @param prepend trueの場合はキューの先頭に追加、falseの場合は末尾に追加\n * @returns 処理完了Promise\n */\n public static enqueue(\n task: () => unknown,\n prepend: boolean = false,\n ): Promise<unknown> {\n return this.ASYNC_QUEUE.enqueue(task, prepend);\n }\n\n /**\n * 全てのキュー処理が完了するまで待機します。\n */\n public static wait(): Promise<void> {\n return this.ASYNC_QUEUE.wait();\n }\n}\n","import Log from './log';\nimport Env from './env';\nimport Queue from './queue';\n\n/**\n * Haoriクラスは、アプリケーション全体で使用されるユーティリティメソッドを提供します。\n * 挙動を変更する場合は必要に応じてオーバライドしてください。\n */\nexport default class Haori {\n /**\n * 実行モードを取得します。\n *\n * @return 実行モード。\n */\n public static get runtime(): 'embedded' | 'demo' {\n return Env.runtime;\n }\n\n /**\n * 実行モードを設定します。\n *\n * @param runtime 設定する実行モード。\n * @return 戻り値はありません。\n */\n public static setRuntime(runtime: string): void {\n Env.setRuntime(runtime);\n }\n\n /**\n * 通知ダイアログを表示します。\n *\n * @param message 表示メッセージ\n * @returns 通知が閉じられると解決されるPromise\n */\n public static dialog(message: string): Promise<void> {\n return Queue.enqueue(() => {\n window.alert(message);\n }, true) as Promise<void>;\n }\n\n /**\n * 通知トーストを表示します。\n *\n * @param message 表示メッセージ\n * @param level メッセージのレベル(省略時は 'info')\n * @return 通知が表示されると解決されるPromise\n */\n public static async toast(\n message: string,\n level: 'info' | 'warning' | 'error' | 'success' = 'info',\n ): Promise<void> {\n const toast = document.createElement('div');\n toast.className = `haori-toast haori-toast-${level}`;\n toast.textContent = message;\n toast.setAttribute('popover', 'manual');\n toast.setAttribute('role', 'status');\n toast.setAttribute('aria-live', level === 'error' ? 'assertive' : 'polite');\n document.body.appendChild(toast);\n toast.showPopover();\n setTimeout(() => {\n try {\n toast.hidePopover();\n } finally {\n toast.remove();\n }\n }, 3000);\n }\n\n /**\n * 確認ダイアログを表示します。\n *\n * @param message 確認メッセージ\n * @returns ユーザーがOKをクリックした場合はtrue、キャンセルした場合はfalseが解決されるPromise\n */\n public static confirm(message: string): Promise<boolean> {\n return Queue.enqueue(() => {\n return window.confirm(message);\n }, true) as Promise<boolean>;\n }\n\n /**\n * ダイアログを開きます。\n *\n * @param element 開くダイアログのHTML要素\n */\n public static openDialog(element: HTMLElement): Promise<void> {\n return Queue.enqueue(() => {\n if (element instanceof HTMLDialogElement) {\n element.showModal();\n } else {\n Log.error('[Haori]', 'Element is not a dialog: ', element);\n }\n }, true) as Promise<void>;\n }\n\n /**\n * ダイアログを閉じます。\n *\n * @param element 閉じるダイアログのHTML要素\n */\n public static closeDialog(element: HTMLElement): Promise<void> {\n return Queue.enqueue(() => {\n if (element instanceof HTMLDialogElement) {\n element.close();\n } else {\n Log.error('[Haori]', 'Element is not a dialog: ', element);\n }\n }, true) as Promise<void>;\n }\n\n /**\n * エラーメッセージを追加します。\n *\n * @param target メッセージを表示する要素\n * @param message エラーメッセージ\n */\n public static addErrorMessage(\n target: HTMLElement | HTMLFormElement,\n message: string,\n ): Promise<void> {\n return Haori.addMessage(target, message, 'error');\n }\n\n /**\n * メッセージをレベル付きで追加します。\n *\n * @param target メッセージを表示する要素\n * @param message メッセージ\n * @param level メッセージのレベル(省略可能)\n */\n public static addMessage(\n target: HTMLElement | HTMLFormElement,\n message: string,\n level?: 'info' | 'warning' | 'error' | 'success',\n ): Promise<void> {\n return Queue.enqueue(() => {\n // 仕様: 入力要素の場合は親要素に、フォーム要素の場合はフォーム自身に data-message を付与する。\n const recipient =\n target instanceof HTMLFormElement\n ? target\n : (target.parentElement ?? target);\n recipient.setAttribute('data-message', message);\n if (level !== undefined) {\n recipient.setAttribute('data-message-level', level);\n } else {\n recipient.removeAttribute('data-message-level');\n }\n }, true) as Promise<void>;\n }\n\n /**\n * 対象のエレメントおよびその子要素のメッセージをクリアします。\n *\n * @param parent メッセージをクリアする親要素\n */\n public static clearMessages(parent: HTMLElement): Promise<void> {\n return Queue.enqueue(() => {\n parent.removeAttribute('data-message');\n parent.removeAttribute('data-message-level');\n parent.querySelectorAll('[data-message]').forEach(element => {\n element.removeAttribute('data-message');\n element.removeAttribute('data-message-level');\n });\n }, true) as Promise<void>;\n }\n}\n","/**\n * @fileoverview フォーム双方向バインディング\n *\n * フォームと入力要素の双方向バインディングを実現します。\n */\n\nimport Core from './core';\nimport Env from './env';\nimport {ElementFragment} from './fragment';\nimport Haori from './haori';\nimport Log from './log';\nimport Queue from './queue';\n\ntype FormHaoriApi = Pick<typeof Haori, 'addErrorMessage' | 'clearMessages'>;\n\nconst FORM_HAORI_METHOD_NAMES = ['addErrorMessage', 'clearMessages'] as const;\n\n/**\n * Form から利用する Haori API を解決します。\n * window.Haori が差し替えられている場合はそちらを優先します。\n *\n * @returns Form が使用する Haori API。\n */\nfunction resolveFormHaoriApi(): FormHaoriApi {\n const scope = globalThis as typeof globalThis & {\n window?: Window & {Haori?: unknown};\n };\n const candidate = scope.window?.Haori;\n const hasRequiredMethods = FORM_HAORI_METHOD_NAMES.every(\n methodName =>\n typeof (candidate as Record<string, unknown> | undefined)?.[\n methodName\n ] === 'function',\n );\n return hasRequiredMethods ? (candidate as FormHaoriApi) : Haori;\n}\n\n/**\n * Formクラスは、フォームの双方向バインディングを提供します。\n * 入力要素の値をフォームにバインドし、フォームのバインド値を入力要素に反映します。\n */\nexport default class Form {\n /**\n * フォーム内にある入力エレメントの値をオブジェクトとして取得します。\n * data-form-object属性があると、そのエレメント内の値はオブジェクトとして処理されます。\n * 入力エレメントにdata-form-list属性があると、そのエレメントの値はリストとして処理されます。\n * 入力エレメント以外にdata-form-list属性があると、そのエレメントの値はオブジェクトのリストとして処理されます。\n *\n * @param form フォームのElementFragment\n */\n public static getValues(form: ElementFragment): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n return Form.getPartValues(form, values);\n }\n\n /**\n * フォーム内の各入力エレメントから値を取得し、オブジェクトとして返します。\n * 入力エレメントのname属性、data-form-object属性、data-form-list属性に基づいて値を整理します。\n *\n * @param fragment 対象のElementFragment\n * @param values オブジェクトに追加する値のオブジェクト\n * @returns values と同じオブジェクト\n */\n private static getPartValues(\n fragment: ElementFragment,\n values: Record<string, unknown>,\n ): Record<string, unknown> {\n const name = fragment.getAttribute('name');\n const objectName = fragment.getAttribute(`${Env.prefix}form-object`);\n const listName = fragment.getAttribute(`${Env.prefix}form-list`);\n if (name) {\n if (listName) {\n if (Array.isArray(values[String(name)])) {\n (values[String(name)] as unknown[]).push(fragment.getValue());\n } else {\n values[String(name)] = [fragment.getValue()];\n }\n } else {\n values[String(name)] = fragment.getValue();\n }\n if (objectName) {\n Log.warn(\n 'Haori',\n `Element cannot have both ${Env.prefix}form-object` +\n ' and name attributes.',\n );\n }\n for (const child of fragment.getChildElementFragments()) {\n Form.getPartValues(child, values);\n }\n } else if (objectName) {\n const childValues: Record<string, unknown> = {};\n for (const child of fragment.getChildElementFragments()) {\n Form.getPartValues(child, childValues);\n }\n if (Object.keys(childValues).length > 0) {\n values[String(objectName)] = childValues;\n }\n if (listName) {\n Log.warn(\n 'Haori',\n `Element cannot have both ${Env.prefix}form-list` +\n ` and ${Env.prefix}form-object attributes.`,\n );\n }\n } else if (listName) {\n const childList: Record<string, unknown>[] = [];\n for (const child of fragment.getChildElementFragments()) {\n const childValues: Record<string, unknown> = {};\n Form.getPartValues(child, childValues);\n if (Object.keys(childValues).length > 0) {\n childList.push(childValues);\n }\n }\n if (childList.length > 0) {\n values[String(listName)] = childList;\n }\n } else {\n for (const child of fragment.getChildElementFragments()) {\n Form.getPartValues(child, values);\n }\n }\n return values;\n }\n\n /**\n * フォーム内にある入力エレメントに値を設定します。\n * フォームのdata-bind属性に値が反映されます。\n *\n * @param form フォームのElementFragment\n * @param values フォームに設定する値のオブジェクト\n * @param force data-form-detach属性があるエレメントにも値を反映するかどうか\n * @returns Promise(DOMの更新が完了したら解決される)\n */\n public static setValues(\n form: ElementFragment,\n values: Record<string, unknown>,\n force: boolean = false,\n ): Promise<void> {\n return Form.setPartValues(form, values, null, force, true);\n }\n\n /**\n * フォーム内にある入力エレメントに値をイベントなしで設定します。\n * フォーム bindingData からの内部同期に利用します。\n *\n * @param form フォームのElementFragment\n * @param values フォームに設定する値のオブジェクト\n * @param force data-form-detach属性があるエレメントにも値を反映するかどうか\n * @returns Promise(DOMの更新が完了したら解決される)\n */\n public static syncValues(\n form: ElementFragment,\n values: Record<string, unknown>,\n force: boolean = false,\n ): Promise<void> {\n return Form.setPartValues(form, values, null, force, false);\n }\n\n /**\n * 単一フラグメントへ値を設定します。\n *\n * @param fragment 対象フラグメント\n * @param value 設定する値\n * @param emitEvents input/change イベントを発火するかどうか\n * @returns Promise(DOMの更新が完了したら解決される)\n */\n private static applyFragmentValue(\n fragment: ElementFragment,\n value: string | number | boolean | null,\n emitEvents: boolean,\n ): Promise<void> {\n return emitEvents\n ? fragment.setValue(value)\n : fragment.syncBindingValue(value);\n }\n\n /**\n * フラグメント内にある各入力エレメントに値を設定します。\n *\n * @param fragment 対象フラグメント\n * @param values フラグメントに設定する値のオブジェクト\n * @param index 配列の場合のインデックス\n * @param force data-form-detach属性があるエレメントにも値を反映するかどうか\n * @returns Promise(DOMの更新が完了したら解決される)\n */\n private static setPartValues(\n fragment: ElementFragment,\n values: Record<string, unknown>,\n index: number | null = null,\n force: boolean = false,\n emitEvents: boolean = true,\n ): Promise<void> {\n const promises: Promise<void>[] = [];\n const name = fragment.getAttribute('name');\n const objectName = fragment.getAttribute(`${Env.prefix}form-object`);\n const listName = fragment.getAttribute(`${Env.prefix}form-list`);\n const detach = fragment.getAttribute(`${Env.prefix}form-detach`);\n if (name) {\n if (!detach || force) {\n const value = values[String(name)];\n if (listName && Array.isArray(value) && index !== null) {\n promises.push(\n Form.applyFragmentValue(fragment, value[index] ?? null, emitEvents),\n );\n } else if (typeof value === 'undefined') {\n // 未指定のキーは既存の入力値を維持する。\n } else if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n promises.push(Form.applyFragmentValue(fragment, value, emitEvents));\n } else {\n promises.push(\n Form.applyFragmentValue(fragment, String(value), emitEvents),\n );\n }\n }\n } else if (objectName) {\n const childValues = values[String(objectName)];\n if (childValues && typeof childValues === 'object') {\n for (const child of fragment.getChildElementFragments()) {\n promises.push(\n Form.setPartValues(\n child,\n childValues as Record<string, unknown>,\n null,\n force,\n emitEvents,\n ),\n );\n }\n }\n } else if (listName) {\n const childList = values[String(listName)];\n if (Array.isArray(childList)) {\n const children = fragment.getChildElementFragments();\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (childList.length > i) {\n promises.push(\n Form.setPartValues(\n child,\n childList[i] as Record<string, unknown>,\n i,\n force,\n emitEvents,\n ),\n );\n } else {\n promises.push(Form.setPartValues(child, {}, i, force, emitEvents));\n }\n }\n }\n } else {\n for (const child of fragment.getChildElementFragments()) {\n promises.push(\n Form.setPartValues(child, values, null, force, emitEvents),\n );\n }\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * 対象フラグメントとその子孫要素の値を初期化します。\n * 値の初期化とメッセージのクリアを行います。\n *\n * @param fragment 対象フラグメント\n * @returns すべての初期化処理が完了するPromise\n */\n public static async reset(fragment: ElementFragment): Promise<void> {\n // 値をクリア\n Form.clearValues(fragment);\n\n // メッセージをクリアし、data-eachの複製を削除\n await Promise.all([\n Form.clearMessages(fragment),\n Form.clearEachClones(fragment),\n ]);\n\n // フォーム要素をリセット\n await Queue.enqueue(() => {\n const element = fragment.getTarget();\n if (element instanceof HTMLFormElement) {\n element.reset();\n } else {\n const parent = element.parentElement;\n if (parent) {\n const next = element.nextElementSibling;\n const form = document.createElement('form');\n form.appendChild(element);\n form.reset();\n parent.insertBefore(element, next);\n }\n }\n });\n\n // 再評価\n await Core.evaluateAll(fragment);\n }\n\n /**\n * data-each によって生成された複製(テンプレート以外)を削除します。\n * 既存のテンプレートは保持し、その後の再評価で必要に応じて再生成されます。\n * 対象エレメント自体がdata-eachを持つ場合はその子の複製を削除しますが、\n * 対象エレメント自体は削除しません。\n */\n private static clearEachClones(fragment: ElementFragment): Promise<void> {\n const tasks: Promise<void>[] = [];\n\n const removeClones = (f: ElementFragment) => {\n if (f.hasAttribute(`${Env.prefix}each`)) {\n for (const child of f.getChildElementFragments()) {\n const isBefore = child.hasAttribute(`${Env.prefix}each-before`);\n const isAfter = child.hasAttribute(`${Env.prefix}each-after`);\n if (!isBefore && !isAfter) {\n tasks.push(child.remove());\n }\n }\n }\n };\n\n const processChildren = (f: ElementFragment) => {\n removeClones(f);\n for (const child of f.getChildElementFragments()) {\n processChildren(child);\n }\n };\n\n // 対象フラグメント自体のクローンを削除し、子エレメント以下を再帰処理\n removeClones(fragment);\n for (const child of fragment.getChildElementFragments()) {\n processChildren(child);\n }\n\n return Promise.all(tasks).then(() => undefined);\n }\n\n /**\n * 再帰的に値を初期化します。\n *\n * @param fragment 対象フラグメント\n */\n private static clearValues(fragment: ElementFragment): void {\n fragment.clearValue();\n for (const child of fragment.getChildElementFragments()) {\n Form.clearValues(child);\n }\n }\n\n /**\n * フラグメントとその子要素のメッセージをクリアします。\n *\n * @param fragment 対象フラグメント\n * @returns Promise(メッセージのクリアが完了したら解決される)\n */\n public static clearMessages(fragment: ElementFragment): Promise<void> {\n return resolveFormHaoriApi().clearMessages(\n fragment.getTarget(),\n ) as Promise<void>;\n }\n\n /**\n * キーに一致するフラグメントにエラーメッセージを追加します。\n * キーに一致するフラグメントが見つからない場合は、指定されたフラグメントにメッセージを追加します。\n *\n * @param fragment 対象フラグメント\n * @param key キー(ドット区切りの文字列)\n * @param message 追加するエラーメッセージ\n * @return Promise(メッセージの追加が完了したら解決される)\n */\n public static addErrorMessage(\n fragment: ElementFragment,\n key: string,\n message: string,\n ): Promise<void> {\n return Form.addMessage(fragment, key, message, 'error');\n }\n\n /**\n * キーに一致するフラグメントにレベル付きメッセージを追加します。\n * キーに一致するフラグメントが見つからない場合は、指定されたフラグメントにメッセージを追加します。\n *\n * @param fragment 対象フラグメント\n * @param key キー(ドット区切りの文字列)\n * @param message 追加するメッセージ\n * @param level メッセージのレベル(省略可能)\n * @return Promise(メッセージの追加が完了したら解決される)\n */\n public static addMessage(\n fragment: ElementFragment,\n key: string,\n message: string,\n level?: 'info' | 'warning' | 'error' | 'success',\n ): Promise<void> {\n const promises: Promise<void>[] = [];\n const activeHaori = resolveFormHaoriApi();\n const addMsgFn = (activeHaori as {addMessage?: typeof Haori.addMessage})\n .addMessage;\n const doAdd = (target: HTMLElement): Promise<void> =>\n typeof addMsgFn === 'function'\n ? (addMsgFn.call(activeHaori, target, message, level) as Promise<void>)\n : (activeHaori.addErrorMessage(target, message) as Promise<void>);\n\n const targetFragments = Form.findFragmentsByKey(fragment, key);\n targetFragments.forEach(targetFragment => {\n promises.push(doAdd(targetFragment.getTarget() as HTMLElement));\n });\n if (targetFragments.length === 0) {\n promises.push(doAdd(fragment.getTarget() as HTMLElement));\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * 指定されたキーに一致するフラグメントを検索します。\n *\n * @param fragment 対象フラグメント\n * @param key キー(ドット区切りの文字列)\n * @returns 一致するフラグメントの配列\n */\n public static findFragmentsByKey(\n fragment: ElementFragment,\n key: string,\n ): ElementFragment[] {\n return Form.findFragmentByKeyParts(fragment, key.split('.'));\n }\n\n /**\n * 指定されたキーに一致するフラグメントを検索します。\n * data-form-list属性で指定された場合はdata-row属性を持つ子要素の位置と添字が一致するものを対象とします。\n *\n * @param fragment 対象フラグメント\n * @param parts キーのパーツ\n * @returns 一致するフラグメントの配列\n */\n private static findFragmentByKeyParts(\n fragment: ElementFragment,\n parts: string[],\n ): ElementFragment[] {\n const results: ElementFragment[] = [];\n const key = parts[0];\n if (parts.length == 1) {\n const name = fragment.getAttribute('name');\n if (name === key) {\n results.push(fragment);\n }\n }\n if (fragment.hasAttribute(`${Env.prefix}form-object`)) {\n if (parts.length > 1) {\n const objectName = fragment.getAttribute(`${Env.prefix}form-object`);\n if (objectName === key) {\n fragment.getChildElementFragments().forEach(child => {\n results.push(...Form.findFragmentByKeyParts(child, parts.slice(1)));\n });\n }\n }\n } else if (fragment.hasAttribute(`${Env.prefix}form-list`)) {\n if (parts.length > 1) {\n const listName = fragment.getAttribute(`${Env.prefix}form-list`);\n const firstPoint = key.lastIndexOf('[');\n const lastPoint = key.lastIndexOf(']');\n if (firstPoint !== -1 && lastPoint !== -1 && firstPoint < lastPoint) {\n const rawKey = key.substring(0, firstPoint);\n if (listName === rawKey) {\n const indexString = key.substring(firstPoint + 1, lastPoint);\n const index = Number(indexString);\n if (isNaN(index)) {\n Log.error('Haori', `Invalid index: ${key}`);\n } else {\n const rows = fragment\n .getChildElementFragments()\n .filter(child => child.hasAttribute(`${Env.prefix}row`));\n if (index < rows.length) {\n results.push(\n ...Form.findFragmentByKeyParts(rows[index], parts.slice(1)),\n );\n }\n }\n }\n }\n }\n } else {\n fragment.getChildElementFragments().forEach(child => {\n results.push(...Form.findFragmentByKeyParts(child, parts));\n });\n }\n return results;\n }\n\n /**\n * 対象のフラグメントがフォームフラグメントであればそれを返し、\n * そうでなければ先祖要素をたどってフォームフラグメントを探します。\n *\n * @param fragment\n */\n public static getFormFragment(\n fragment: ElementFragment,\n ): ElementFragment | null {\n const element = fragment.getTarget();\n if (element instanceof HTMLFormElement) {\n return fragment;\n }\n const parent = fragment.getParent();\n if (parent) {\n return this.getFormFragment(parent);\n }\n return null;\n }\n}\n","/**\n * @fileoverview 仮想DOM実装\n *\n * メモリ上にノードツリーを保持し、DOMへの反映を非同期で行います。\n * DOMからの読み込みは行わず、オブザーバーとchangeイベントで更新されます。\n */\nimport Queue from './queue';\nimport Log from './log';\nimport Expression from './expression';\nimport Env from './env';\nimport Dev from './dev';\n\ninterface EvaluationProfilePlaceholderSnapshot {\n expression: string;\n calls: number;\n totalDurationMs: number;\n maxDurationMs: number;\n}\n\ninterface EvaluationProfileAttributeSnapshot {\n name: string;\n template: string;\n calls: number;\n totalDurationMs: number;\n maxDurationMs: number;\n placeholders: EvaluationProfilePlaceholderSnapshot[];\n}\n\ninterface EvaluationProfileTextSnapshot {\n childIndex: number;\n template: string;\n calls: number;\n totalDurationMs: number;\n maxDurationMs: number;\n placeholders: EvaluationProfilePlaceholderSnapshot[];\n}\n\ninterface EvaluationProfileElementSnapshot {\n elementId: string;\n tagName: string;\n attributes: EvaluationProfileAttributeSnapshot[];\n texts: EvaluationProfileTextSnapshot[];\n}\n\ntype EvaluationProfileContext =\n | {\n kind: 'attribute';\n element: HTMLElement;\n rawName: string;\n template: string;\n }\n | {\n kind: 'text';\n element: HTMLElement;\n childIndex: number;\n template: string;\n };\n\ninterface EvaluationProfileCounter {\n template: string;\n calls: number;\n totalDurationMs: number;\n maxDurationMs: number;\n placeholders: Map<string, EvaluationProfilePlaceholderCounter>;\n}\n\ninterface EvaluationProfilePlaceholderCounter {\n calls: number;\n totalDurationMs: number;\n maxDurationMs: number;\n}\n\ninterface EvaluationProfileElementStore {\n tagName: string;\n attributes: Map<string, EvaluationProfileCounter>;\n texts: Map<string, EvaluationProfileCounter>;\n}\n\n/**\n * 開発時の属性・テキスト評価回数を集計するレジストリです。\n */\nclass EvaluationProfileRegistry {\n /** globalThis に公開するキー */\n private static readonly GLOBAL_KEY = '__HAORI_EVALUATION_PROFILE__';\n\n /** エレメントごとの集計 */\n private static readonly ELEMENT_STORES = new Map<\n string,\n EvaluationProfileElementStore\n >();\n\n /**\n * 集計状態を初期化します。\n */\n public static reset(): void {\n EvaluationProfileRegistry.ELEMENT_STORES.clear();\n EvaluationProfileRegistry.ensureGlobalAccess();\n }\n\n /**\n * 現在の集計結果スナップショットを返します。\n *\n * @returns エレメントごとの集計結果\n */\n public static snapshot(): EvaluationProfileElementSnapshot[] {\n EvaluationProfileRegistry.ensureGlobalAccess();\n return [...EvaluationProfileRegistry.ELEMENT_STORES.entries()]\n .map(([elementId, store]) => ({\n elementId,\n tagName: store.tagName,\n attributes: [...store.attributes.entries()]\n .map(([name, counter]) => ({\n name,\n template: counter.template,\n calls: counter.calls,\n totalDurationMs: counter.totalDurationMs,\n maxDurationMs: counter.maxDurationMs,\n placeholders: EvaluationProfileRegistry.sortPlaceholders(\n counter.placeholders,\n ),\n }))\n .sort((left, right) => right.calls - left.calls),\n texts: [...store.texts.entries()]\n .map(([childIndex, counter]) => ({\n childIndex: Number(childIndex),\n template: counter.template,\n calls: counter.calls,\n totalDurationMs: counter.totalDurationMs,\n maxDurationMs: counter.maxDurationMs,\n placeholders: EvaluationProfileRegistry.sortPlaceholders(\n counter.placeholders,\n ),\n }))\n .sort((left, right) => right.calls - left.calls),\n }))\n .sort((left, right) => {\n const leftCalls =\n left.attributes.reduce((sum, item) => sum + item.calls, 0) +\n left.texts.reduce((sum, item) => sum + item.calls, 0);\n const rightCalls =\n right.attributes.reduce((sum, item) => sum + item.calls, 0) +\n right.texts.reduce((sum, item) => sum + item.calls, 0);\n return rightCalls - leftCalls;\n });\n }\n\n /**\n * 評価呼び出しを記録します。\n *\n * @param context 評価コンテキスト\n * @param expressions 今回評価した式一覧\n */\n public static record(\n context: EvaluationProfileContext | undefined,\n expressions: Array<{expression: string; durationMs: number}>,\n totalDurationMs: number,\n ): void {\n if (!Dev.isEnabled() || !context || expressions.length === 0) {\n return;\n }\n EvaluationProfileRegistry.ensureGlobalAccess();\n const store = EvaluationProfileRegistry.getOrCreateElementStore(\n context.element,\n );\n if (context.kind === 'attribute') {\n const counter = EvaluationProfileRegistry.getOrCreateCounter(\n store.attributes,\n context.rawName,\n context.template,\n );\n EvaluationProfileRegistry.updateCounter(\n counter,\n expressions,\n totalDurationMs,\n );\n return;\n }\n const counter = EvaluationProfileRegistry.getOrCreateCounter(\n store.texts,\n String(context.childIndex),\n context.template,\n );\n EvaluationProfileRegistry.updateCounter(\n counter,\n expressions,\n totalDurationMs,\n );\n }\n\n /**\n * globalThis から dev-only の取得窓口を参照できるようにします。\n */\n private static ensureGlobalAccess(): void {\n if (!Dev.isEnabled()) {\n return;\n }\n const globalRecord = globalThis as Record<string, unknown>;\n if (globalRecord[EvaluationProfileRegistry.GLOBAL_KEY] !== undefined) {\n return;\n }\n globalRecord[EvaluationProfileRegistry.GLOBAL_KEY] = {\n reset: () => EvaluationProfileRegistry.reset(),\n snapshot: () => EvaluationProfileRegistry.snapshot(),\n };\n }\n\n /**\n * エレメント単位の集計ストアを取得または初期化します。\n *\n * @param element 対象エレメント\n * @returns 集計ストア\n */\n private static getOrCreateElementStore(\n element: HTMLElement,\n ): EvaluationProfileElementStore {\n const elementId = EvaluationProfileRegistry.createElementId(element);\n const existing = EvaluationProfileRegistry.ELEMENT_STORES.get(elementId);\n if (existing) {\n return existing;\n }\n const store: EvaluationProfileElementStore = {\n tagName: element.tagName.toLowerCase(),\n attributes: new Map(),\n texts: new Map(),\n };\n EvaluationProfileRegistry.ELEMENT_STORES.set(elementId, store);\n return store;\n }\n\n /**\n * カウンタを取得または初期化します。\n *\n * @param counters 種別ごとのカウンタマップ\n * @param key カウンタキー\n * @param template 元テンプレート\n * @returns カウンタ\n */\n private static getOrCreateCounter(\n counters: Map<string, EvaluationProfileCounter>,\n key: string,\n template: string,\n ): EvaluationProfileCounter {\n const existing = counters.get(key);\n if (existing) {\n return existing;\n }\n const counter: EvaluationProfileCounter = {\n template,\n calls: 0,\n totalDurationMs: 0,\n maxDurationMs: 0,\n placeholders: new Map(),\n };\n counters.set(key, counter);\n return counter;\n }\n\n /**\n * プレースホルダカウンタを取得または初期化します。\n *\n * @param placeholders プレースホルダカウンタマップ\n * @param expression 式文字列\n * @returns プレースホルダカウンタ\n */\n private static getOrCreatePlaceholder(\n placeholders: Map<string, EvaluationProfilePlaceholderCounter>,\n expression: string,\n ): EvaluationProfilePlaceholderCounter {\n const existing = placeholders.get(expression);\n if (existing) {\n return existing;\n }\n const counter: EvaluationProfilePlaceholderCounter = {\n calls: 0,\n totalDurationMs: 0,\n maxDurationMs: 0,\n };\n placeholders.set(expression, counter);\n return counter;\n }\n\n /**\n * カウンタへ今回の評価結果を加算します。\n *\n * @param counter 更新対象カウンタ\n * @param expressions 今回評価した式一覧\n * @param totalDurationMs 今回の総所要時間\n */\n private static updateCounter(\n counter: EvaluationProfileCounter,\n expressions: Array<{expression: string; durationMs: number}>,\n totalDurationMs: number,\n ): void {\n counter.calls += 1;\n counter.totalDurationMs += totalDurationMs;\n counter.maxDurationMs = Math.max(counter.maxDurationMs, totalDurationMs);\n expressions.forEach(expression => {\n const placeholder = EvaluationProfileRegistry.getOrCreatePlaceholder(\n counter.placeholders,\n expression.expression,\n );\n placeholder.calls += 1;\n placeholder.totalDurationMs += expression.durationMs;\n placeholder.maxDurationMs = Math.max(\n placeholder.maxDurationMs,\n expression.durationMs,\n );\n });\n }\n\n /**\n * プレースホルダ集計を calls 降順で返します。\n *\n * @param placeholders プレースホルダ集計\n * @returns スナップショット\n */\n private static sortPlaceholders(\n placeholders: Map<string, EvaluationProfilePlaceholderCounter>,\n ): EvaluationProfilePlaceholderSnapshot[] {\n return [...placeholders.entries()]\n .map(([expression, counter]) => ({\n expression,\n calls: counter.calls,\n totalDurationMs: counter.totalDurationMs,\n maxDurationMs: counter.maxDurationMs,\n }))\n .sort((left, right) => {\n if (right.calls !== left.calls) {\n return right.calls - left.calls;\n }\n return right.totalDurationMs - left.totalDurationMs;\n });\n }\n\n /**\n * 現在時刻のタイムスタンプを返します。\n *\n * @returns ミリ秒\n */\n private static now(): number {\n return globalThis.performance?.now() ?? Date.now();\n }\n\n /**\n * 評価処理の所要時間を計測します。\n *\n * @param callback 計測対象\n * @returns 結果と所要時間\n */\n public static measure<T>(callback: () => T): {\n value: T;\n durationMs: number;\n } {\n const startedAt = EvaluationProfileRegistry.now();\n const value = callback();\n return {\n value,\n durationMs: EvaluationProfileRegistry.now() - startedAt,\n };\n }\n\n /**\n * エレメント識別子を生成します。\n *\n * @param element 対象エレメント\n * @returns 識別子\n */\n private static createElementId(element: HTMLElement): string {\n const segments: string[] = [];\n let current: Element | null = element;\n while (current) {\n let segment = current.tagName.toLowerCase();\n const rawId = current.getAttribute('id') || '';\n if (rawId.trim() !== '') {\n segment += `#${rawId.trim()}`;\n segments.unshift(segment);\n break;\n }\n const deriveName = current.getAttribute(`${Env.prefix}derive-name`);\n if (deriveName && deriveName.trim() !== '') {\n segment += `[${Env.prefix}derive-name=\"${deriveName.trim()}\"]`;\n }\n const parent: Element | null = current.parentElement;\n if (parent) {\n segment += `:nth-child(${[...parent.children].indexOf(current) + 1})`;\n }\n segments.unshift(segment);\n current = parent;\n }\n return segments.join(' > ');\n }\n}\n\n/**\n * 属性評価結果の詳細です。\n */\nexport interface AttributeEvaluationDetail {\n /** 評価済みの値 */\n value: string | false | unknown | null;\n\n /** 未解決参照が含まれていたかどうか */\n hasUnresolvedReference: boolean;\n}\n\n/**\n * 仮想DOMのフラグメントの抽象クラス。\n */\nexport default abstract class Fragment {\n /** フラグメントの対象ノードに対するキャッシュ */\n protected static readonly FRAGMENT_CACHE = new WeakMap<Node, Fragment>();\n\n /**\n * フラグメントを取得もしくは作成します。\n *\n * @param node 対象ノード\n * @returns フラグメント\n */\n public static get(node: HTMLElement): ElementFragment;\n public static get(node: Text): TextFragment;\n public static get(node: Comment): CommentFragment;\n public static get(node: Node | null): Fragment | null;\n public static get(node: Node | null): Fragment | null {\n if (node == null) {\n return null;\n }\n if (Fragment.FRAGMENT_CACHE.has(node)) {\n return Fragment.FRAGMENT_CACHE.get(node)!;\n }\n let fragment;\n switch (node.nodeType) {\n case Node.ELEMENT_NODE:\n fragment = new ElementFragment(node as HTMLElement);\n break;\n case Node.TEXT_NODE:\n fragment = new TextFragment(node as Text);\n break;\n case Node.COMMENT_NODE:\n fragment = new CommentFragment(node as Comment);\n break;\n default:\n Log.warn('[Haori]', 'Unsupported node type:', node.nodeType);\n return null;\n }\n return fragment;\n }\n\n /** 親フラグメント */\n protected parent: ElementFragment | null = null;\n\n /** 対象ノード */\n protected readonly target: Node;\n\n /** フラグメントがDOMにマウントされているかどうか */\n protected mounted = false;\n\n /** ノード更新スキップフラグ(オブザーバーによる無限ループ対応) */\n protected skipMutationNodes = false;\n\n /**\n * フラグメントのコンストラクタ。\n *\n * @param target 対象ノード\n */\n protected constructor(target: Node) {\n this.target = target;\n Fragment.FRAGMENT_CACHE.set(target, this);\n }\n\n /**\n * skipMutationNodesフラグの値を取得します。\n *\n * @returns skipMutationNodesの値\n */\n public isSkipMutationNodes(): boolean {\n return this.skipMutationNodes;\n }\n\n /**\n * フラグメントをDOMから除去します。\n *\n * @return 除去のPromise\n */\n public unmount(): Promise<void> {\n if (!this.mounted || this.skipMutationNodes) {\n return Promise.resolve();\n }\n if (this.parent) {\n const parent = this.parent;\n const prevSkip = parent.skipMutationNodes;\n return Queue.enqueue(() => {\n parent.skipMutationNodes = true;\n if (this.target.parentNode === parent.getTarget()) {\n parent.getTarget().removeChild(this.target);\n }\n this.mounted = false;\n }).finally(() => {\n parent.skipMutationNodes = prevSkip;\n }) as Promise<void>;\n } else {\n // 親フラグメント情報が無くても、DOM 上に親ノードが存在する場合は安全に除去する。\n const host = this.target.parentNode as HTMLElement | null;\n if (host) {\n return Queue.enqueue(() => {\n if (this.target.parentNode === host) {\n host.removeChild(this.target);\n }\n this.mounted = false;\n }) as Promise<void>;\n }\n this.mounted = false;\n }\n return Promise.resolve();\n }\n\n /**\n * フラグメントをDOMに追加します。\n *\n * @return 追加のPromise\n */\n public mount(): Promise<void> {\n if (this.mounted || this.skipMutationNodes) {\n return Promise.resolve();\n }\n if (this.parent) {\n const parent = this.parent;\n const prevSkip = parent.skipMutationNodes;\n return Queue.enqueue(() => {\n parent.skipMutationNodes = true;\n if (this.target.parentNode !== parent.getTarget()) {\n // 既に同じ親なら何もしない\n parent.getTarget().appendChild(this.target);\n }\n this.mounted = true;\n }).finally(() => {\n parent.skipMutationNodes = prevSkip;\n }) as Promise<void>;\n }\n return Promise.resolve();\n }\n\n /**\n * フラグメントのマウント状態を取得します。\n *\n * @returns マウント状態\n */\n public isMounted(): boolean {\n return this.mounted;\n }\n\n /**\n * フラグメントのマウント状態を設定します。\n *\n * @param mounted マウント状態\n */\n public setMounted(mounted: boolean): void {\n this.mounted = mounted;\n }\n\n /**\n * フラグメントをクローンします。\n *\n * @returns クローンされたフラグメント\n */\n public abstract clone(): Fragment;\n\n /**\n * フラグメントとノードを削除します。\n *\n * @param unmount DOMからの除去を行うかどうか(内部の子呼び出しの場合のみfalseとする)\n * @return 除去のPromise\n */\n public remove(unmount = true): Promise<void> {\n if (this.parent) {\n this.parent.removeChild(this);\n }\n Fragment.FRAGMENT_CACHE.delete(this.target);\n if (unmount) {\n return this.unmount();\n }\n return Promise.resolve();\n }\n\n /**\n * 対象ノードを取得します。\n *\n * @returns 対象ノード\n */\n public getTarget(): Node {\n return this.target;\n }\n\n /**\n * 親フラグメントを取得します。\n *\n * @returns 親フラグメント\n */\n public getParent(): ElementFragment | null {\n return this.parent;\n }\n\n /**\n * 親フラグメントを設定します。\n *\n * @param parent 親フラグメント\n */\n public setParent(parent: ElementFragment | null): void {\n this.parent = parent;\n }\n}\n\n/**\n * エレメントフラグメント。\n * DOM要素を表現し、子ノードを持つことができます。\n */\nexport class ElementFragment extends Fragment {\n /** HTML 真偽属性名のセット */\n private static readonly BOOLEAN_ATTRIBUTES = new Set([\n 'allowfullscreen',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'hidden',\n 'inert',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected',\n ]);\n\n /** inputイベントを発生させるタイプ */\n private readonly INPUT_EVENT_TYPES = [\n 'text',\n 'password',\n 'email',\n 'url',\n 'tel',\n 'search',\n 'number',\n 'range',\n 'color',\n 'date',\n 'datetime-local',\n 'month',\n 'time',\n 'week',\n ];\n\n /** 子フラグメントのリスト */\n private readonly children: Fragment[] = [];\n\n /** 属性名に対する属性情報のマップ */\n private readonly attributeMap = new Map<string, AttributeContents>();\n\n /** バインドデータ */\n private bindingData: Record<string, unknown> | null = null;\n\n /** 子孫要素へ公開する派生バインドデータ */\n private derivedBindingData: Record<string, unknown> | null = null;\n\n /** バインドデータのキャッシュ */\n private bindingDataCache: Record<string, unknown> | null = null;\n\n /** 子孫要素向けバインドデータのキャッシュ */\n private descendantBindingDataCache: Record<string, unknown> | null = null;\n\n /** 表示状態 */\n private visible = true;\n\n /** 元の display 値 */\n private display: string | null = null;\n\n /** 元の display の優先度 */\n private displayPriority: string | null = null;\n\n /** each用のテンプレート */\n private template: ElementFragment | null = null;\n\n /** each比較用のキー */\n private listKey: string | null = null;\n\n /** 直近に描画した each 行の入力署名 */\n private renderSignature: string | null = null;\n\n /** 直近に描画した data-each 全体の入力署名 */\n private eachInputSignature: string | null = null;\n\n /** 直近に公開した data-derive subtree の入力署名 */\n private deriveSubtreeSignature: string | null = null;\n\n /** 直近に評価した data-derive の入力署名 */\n private deriveInputSignature: string | null = null;\n\n /** fresh clone 初期化を subtree ごと省略できるかどうか */\n private freshInitializationSkippable = false;\n\n /** valueプロパティの値 */\n private value: string | number | boolean | null = null;\n\n /** 属性更新スキップフラグ(オブザーバーによる無限ループ対応) */\n private skipMutationAttributes = false;\n\n /** 値変更スキップフラグ(更新イベントによる無限ループ対応) */\n private skipChangeValue = false;\n\n /**\n * エレメントフラグメントのコンストラクタ。\n * アトリビュートや子フラグメントの作成も行います。\n *\n * @param target 対象エレメント\n */\n public constructor(target: HTMLElement) {\n super(target);\n this.syncValue();\n target.getAttributeNames().forEach(name => {\n const value = target.getAttribute(name);\n if (value !== null && !this.attributeMap.has(name)) {\n const contents = new AttributeContents(name, value);\n this.attributeMap.set(name, contents);\n }\n });\n target.childNodes.forEach(node => {\n const childFragment = Fragment.get(node);\n childFragment!.setParent(this);\n this.children.push(childFragment!);\n });\n }\n\n /**\n * 子フラグメントのリストを取得します。\n *\n * @returns 子フラグメントのリスト\n */\n public getChildren(): Fragment[] {\n return this.children;\n }\n\n /**\n * 子エレメントフラグメントのリストを取得します。\n *\n * @returns 子エレメントフラグメントのリスト\n */\n public getChildElementFragments(): ElementFragment[] {\n return this.children.filter(\n child => child instanceof ElementFragment,\n ) as ElementFragment[];\n }\n\n /**\n * 子フラグメントをリストに追加します。\n * DOMの追加は行いません。\n *\n * @param child 追加する子フラグメント\n */\n public pushChild(child: Fragment) {\n this.children.push(child);\n child.setParent(this);\n }\n\n /**\n * 子フラグメントをリストから削除します。\n * DOMからの削除は行いません。\n *\n * @param child 削除する子フラグメント\n */\n public removeChild(child: Fragment): void {\n const index = this.children.indexOf(child);\n if (index < 0) {\n Log.warn('[Haori]', 'Child fragment not found.', child);\n return;\n }\n this.children.splice(index, 1);\n child.setParent(null);\n }\n\n /**\n * フラグメントをクローンします。\n *\n * @returns クローンされたフラグメント\n */\n public clone(): ElementFragment {\n const clone = new ElementFragment(\n this.target.cloneNode(false) as HTMLElement,\n );\n // DOM 属性は評価後の値になっているため、\n // クローンでは attributeMap をコピーしてテンプレート式を保持します。\n this.attributeMap.forEach((contents, name) => {\n clone.attributeMap.set(name, contents);\n });\n this.children.forEach(child => {\n const childClone = child.clone();\n clone.getTarget().appendChild(childClone.getTarget());\n clone.pushChild(childClone);\n });\n clone.mounted = false;\n clone.bindingData = this.bindingData;\n clone.derivedBindingData = this.derivedBindingData;\n clone.clearBindingDataCache();\n clone.visible = true;\n clone.display = this.display;\n clone.displayPriority = this.displayPriority;\n clone.template = this.template;\n clone.renderSignature = this.renderSignature;\n clone.eachInputSignature = this.eachInputSignature;\n clone.deriveSubtreeSignature = null;\n clone.deriveInputSignature = null;\n clone.freshInitializationSkippable = this.freshInitializationSkippable;\n clone.normalizeClonedVisibilityState();\n return clone;\n }\n\n /**\n * clone 時に runtime の hidden 状態だけを落とします。\n */\n private normalizeClonedVisibilityState(): void {\n if (\n this.visible === false ||\n this.getTarget().style.display === 'none' ||\n this.getTarget().hasAttribute(`${Env.prefix}if-false`)\n ) {\n this.visible = true;\n this.display = null;\n this.displayPriority = null;\n this.getTarget().style.removeProperty('display');\n this.getTarget().removeAttribute(`${Env.prefix}if-false`);\n }\n this.children.forEach(child => {\n if (child instanceof ElementFragment) {\n child.normalizeClonedVisibilityState();\n }\n });\n }\n\n /**\n * フラグメントとノードを削除します。\n *\n * @param unmount DOMからの除去を行うかどうか(内部の子呼び出しの場合のみfalseとする)\n * @return 除去のPromise\n */\n public remove(unmount = true): Promise<void> {\n const promises: Promise<void>[] = [];\n this.children.forEach(child => {\n promises.push(child.remove(false));\n });\n this.children.length = 0;\n this.attributeMap.clear();\n this.bindingData = null;\n this.bindingDataCache = null;\n this.derivedBindingData = null;\n this.descendantBindingDataCache = null;\n if (this.template) {\n promises.push(this.template.remove(false));\n this.template = null;\n }\n this.eachInputSignature = null;\n this.deriveSubtreeSignature = null;\n this.deriveInputSignature = null;\n promises.push(super.remove(unmount));\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * フラグメントの対象エレメントを取得します。\n *\n * @returns フラグメントの対象エレメント\n */\n public getTarget(): HTMLElement {\n return this.target as HTMLElement;\n }\n\n /**\n * 継承を考慮したバインドデータを取得します。\n *\n * @returns バインドデータのオブジェクト\n */\n public getBindingData(): Record<string, unknown> {\n if (this.bindingDataCache) {\n return this.bindingDataCache;\n }\n this.bindingDataCache = {};\n if (this.parent) {\n Object.assign(\n this.bindingDataCache,\n this.parent.getDescendantBindingData(),\n );\n }\n if (this.bindingData) {\n Object.assign(this.bindingDataCache, this.bindingData);\n }\n return this.bindingDataCache;\n }\n\n /**\n * 子孫要素向けのバインドデータを取得します。\n *\n * @returns 子孫要素向けのバインドデータ\n */\n public getDescendantBindingData(): Record<string, unknown> {\n if (this.descendantBindingDataCache) {\n return this.descendantBindingDataCache;\n }\n this.descendantBindingDataCache = {...this.getBindingData()};\n if (this.derivedBindingData) {\n Object.assign(this.descendantBindingDataCache, this.derivedBindingData);\n }\n return this.descendantBindingDataCache;\n }\n\n /**\n * 生のバインドデータを取得します。\n *\n * @returns 生のバインドデータ\n */\n public getRawBindingData(): Record<string, unknown> | null {\n return this.bindingData;\n }\n\n /**\n * 生の派生バインドデータを取得します。\n *\n * @returns 生の派生バインドデータ\n */\n public getRawDerivedBindingData(): Record<string, unknown> | null {\n return this.derivedBindingData;\n }\n\n /**\n * バインドデータを設定します。\n *\n * @param data バインドデータ\n */\n public setBindingData(data: Record<string, unknown>): void {\n this.bindingData = data;\n this.clearBindingDataCache();\n }\n\n /**\n * 子孫要素向けの派生バインドデータを設定します。\n *\n * @param data 派生バインドデータ。解除する場合は null\n */\n public setDerivedBindingData(data: Record<string, unknown> | null): void {\n this.derivedBindingData = data;\n this.clearBindingDataCache();\n }\n\n /**\n * 親フラグメントを設定します。バインドデータキャッシュをクリアします。\n *\n * @param parent 親フラグメント\n */\n public override setParent(parent: ElementFragment | null): void {\n if (this.parent === parent) {\n return;\n }\n this.parent = parent;\n this.clearBindingDataCache();\n }\n\n /**\n * バインドデータのキャッシュをクリアします。\n */\n public clearBindingDataCache(): void {\n this.bindingDataCache = null;\n this.descendantBindingDataCache = null;\n this.children.forEach(child => {\n if (child instanceof ElementFragment) {\n child.clearBindingDataCache();\n }\n });\n }\n\n /**\n * フラグメントのテンプレートを取得します。\n *\n * @returns テンプレート\n */\n public getTemplate(): ElementFragment | null {\n return this.template;\n }\n\n /**\n * フラグメントのテンプレートを設定します。\n *\n * @param template フラグメントのテンプレート\n */\n public setTemplate(template: ElementFragment | null): void {\n this.template = template;\n }\n\n /**\n * 比較用リストキーを設定します。\n *\n * @param key 比較用リストキー\n */\n public setListKey(key: string): void {\n this.listKey = key;\n }\n\n /**\n * 比較用リストキーを取得します。\n *\n * @returns 比較用リストキー\n */\n public getListKey(): string | null {\n return this.listKey;\n }\n\n /**\n * 直近に描画した each 行の入力署名を取得します。\n *\n * @returns 入力署名\n */\n public getRenderSignature(): string | null {\n return this.renderSignature;\n }\n\n /**\n * 直近に描画した each 行の入力署名を設定します。\n *\n * @param signature 入力署名\n */\n public setRenderSignature(signature: string | null): void {\n this.renderSignature = signature;\n }\n\n /**\n * 直近に描画した data-each 全体の入力署名を取得します。\n *\n * @returns 入力署名\n */\n public getEachInputSignature(): string | null {\n return this.eachInputSignature;\n }\n\n /**\n * 直近に描画した data-each 全体の入力署名を設定します。\n *\n * @param signature 入力署名\n */\n public setEachInputSignature(signature: string | null): void {\n this.eachInputSignature = signature;\n }\n\n /**\n * 直近に公開した data-derive subtree の入力署名を取得します。\n *\n * @returns 入力署名\n */\n public getDeriveSubtreeSignature(): string | null {\n return this.deriveSubtreeSignature;\n }\n\n /**\n * 直近に公開した data-derive subtree の入力署名を設定します。\n *\n * @param signature 入力署名\n */\n public setDeriveSubtreeSignature(signature: string | null): void {\n this.deriveSubtreeSignature = signature;\n }\n\n /**\n * 直近に評価した data-derive の入力署名を取得します。\n *\n * @returns 入力署名\n */\n public getDeriveInputSignature(): string | null {\n return this.deriveInputSignature;\n }\n\n /**\n * 直近に評価した data-derive の入力署名を設定します。\n *\n * @param signature 入力署名\n */\n public setDeriveInputSignature(signature: string | null): void {\n this.deriveInputSignature = signature;\n }\n\n /**\n * fresh clone 初期化を subtree ごと省略できるかどうかを返します。\n *\n * @returns 省略可能なら true\n */\n public isFreshInitializationSkippable(): boolean {\n return this.freshInitializationSkippable;\n }\n\n /**\n * fresh clone 初期化を subtree ごと省略できるかどうかを設定します。\n *\n * @param skippable 省略可能なら true\n */\n public setFreshInitializationSkippable(skippable: boolean): void {\n this.freshInitializationSkippable = skippable;\n }\n\n /**\n * 入力エレメントに値を設定します。\n * チェックボックとラジオボタンの場合は値に一致するかどうかでチェック状態を変更します。\n *\n * @param value 値\n * @returns エレメントの更新のPromise\n */\n public setValue(value: string | number | boolean | null): Promise<void> {\n return this.applyValue(value, true);\n }\n\n /**\n * 入力エレメントに値をイベントなしで設定します。\n * フォームの bindingData 反映時に内部同期として利用します。\n *\n * @param value 値\n * @returns エレメントの更新のPromise\n */\n public syncBindingValue(\n value: string | number | boolean | null,\n ): Promise<void> {\n return this.applyValue(value, false);\n }\n\n /**\n * 入力エレメントに値を設定します。\n * 必要に応じて入力系イベントも発火します。\n *\n * @param value 値\n * @param dispatchEvents input/change イベントを発火するかどうか\n * @returns エレメントの更新のPromise\n */\n private applyValue(\n value: string | number | boolean | null,\n dispatchEvents: boolean,\n ): Promise<void> {\n if (this.skipChangeValue) {\n return Promise.resolve();\n }\n if (this.value === value) {\n return Promise.resolve();\n }\n const element = this.getTarget();\n if (\n element instanceof HTMLInputElement &&\n (element.type === 'checkbox' || element.type === 'radio')\n ) {\n const result = this.getAttribute('value');\n const isBooleanCheckbox =\n element.type === 'checkbox' && result === 'true';\n let newChecked: boolean;\n if (isBooleanCheckbox) {\n newChecked = value === true || value === 'true';\n } else if (result === 'false') {\n newChecked = value === false;\n } else {\n newChecked = result === String(value);\n }\n this.value = isBooleanCheckbox ? newChecked : newChecked ? value : null;\n if (element.checked === newChecked) {\n return Promise.resolve();\n }\n this.skipChangeValue = true;\n return Queue.enqueue(() => {\n element.checked = newChecked;\n if (dispatchEvents) {\n element.dispatchEvent(new Event('change', {bubbles: true}));\n }\n }).finally(() => {\n this.skipChangeValue = false;\n }) as Promise<void>;\n } else if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n this.value = value;\n this.skipChangeValue = true;\n return Queue.enqueue(() => {\n element.value = value === null ? '' : String(value);\n if (dispatchEvents) {\n if (\n (element instanceof HTMLInputElement &&\n this.INPUT_EVENT_TYPES.includes(element.type)) ||\n element instanceof HTMLTextAreaElement\n ) {\n element.dispatchEvent(new Event('input', {bubbles: true}));\n }\n element.dispatchEvent(new Event('change', {bubbles: true}));\n }\n }).finally(() => {\n this.skipChangeValue = false;\n }) as Promise<void>;\n } else {\n Log.warn(\n '[Haori]',\n 'setValue is not supported for this element type.',\n element,\n );\n return Promise.resolve();\n }\n }\n\n /**\n * 入力エレメントの値を取得します。\n * DOM要素の現在の値と同期します。\n *\n * @returns 入力エレメントの値\n */\n public getValue(): string | number | boolean | null {\n return this.value;\n }\n\n /**\n * 内部の値をクリアします。エレメントのvalue値は変化しません。\n */\n public clearValue() {\n this.value = null;\n }\n\n /**\n * 内部の値をDOMの値と同期します。\n * changeイベント時など、DOM値が変更された後に呼び出されます。\n */\n public syncValue() {\n const element = this.getTarget();\n if (element instanceof HTMLInputElement) {\n if (element.type === 'checkbox' || element.type === 'radio') {\n const isBooleanCheckbox =\n element.type === 'checkbox' && element.value === 'true';\n if (element.checked) {\n const value = element.value;\n if (isBooleanCheckbox) {\n this.value = true;\n } else if (value === 'false') {\n this.value = false;\n } else {\n this.value = value;\n }\n } else {\n // チェックボックスがOFFの場合\n const value = element.value;\n if (isBooleanCheckbox) {\n this.value = false;\n } else if (value === 'false') {\n this.value = true;\n } else {\n this.value = null;\n }\n }\n } else {\n this.value = element.value;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n this.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n this.value = element.value;\n }\n }\n\n /**\n * 属性の値を評価して設定します。\n * 評価値がfalseの場合は属性を削除します。\n * 矯正評価属性の場合は元の値を設定します。\n *\n * @param name 属性名\n * @param value 属性値\n * @returns 属性の更新のPromise\n */\n public setAttribute(\n name: string,\n value: string | null,\n fromObserver = false,\n ): Promise<void> {\n return this.setAttributeInternal(name, name, value, true, fromObserver);\n }\n\n /**\n * data-attr-* の生値を保持しつつ、別名の属性へ評価結果を反映します。\n *\n * @param rawName 生の属性名\n * @param targetName 反映先の属性名\n * @param value 生の属性値\n * @returns 属性更新の Promise\n */\n public setAliasedAttribute(\n rawName: string,\n targetName: string,\n value: string | null,\n fromObserver = false,\n ): Promise<void> {\n return this.setAttributeInternal(\n rawName,\n targetName,\n value,\n false,\n fromObserver,\n );\n }\n\n /**\n * data-attr-* の生属性と反映先属性を同時に削除します。\n *\n * @param rawName 生の属性名\n * @param targetName 反映先の属性名\n * @returns 属性削除の Promise\n */\n public removeAliasedAttribute(\n rawName: string,\n targetName: string,\n ): Promise<void> {\n if (this.skipMutationAttributes) {\n return Promise.resolve();\n }\n this.attributeMap.delete(rawName);\n this.skipMutationAttributes = true;\n const element = this.getTarget();\n return Queue.enqueue(() => {\n element.removeAttribute(rawName);\n if (targetName !== rawName) {\n element.removeAttribute(targetName);\n }\n }).finally(() => {\n this.skipMutationAttributes = false;\n }) as Promise<void>;\n }\n\n /**\n * 生の属性値を保持しつつ、必要に応じて別名属性へ評価結果を反映します。\n *\n * @param rawName 生の属性名\n * @param targetName 反映先の属性名\n * @param value 生の属性値\n * @param syncValueProperty value 属性更新時に DOM property も同期するかどうか\n * @returns 属性更新の Promise\n */\n private setAttributeInternal(\n rawName: string,\n targetName: string,\n value: string | null,\n syncValueProperty: boolean,\n fromObserver = false,\n ): Promise<void> {\n if (this.skipMutationAttributes) {\n return Promise.resolve();\n }\n if (value === null) {\n if (rawName === targetName) {\n return this.removeAttribute(rawName);\n }\n return this.removeAliasedAttribute(rawName, targetName);\n }\n const contents = new AttributeContents(rawName, value);\n if (fromObserver) {\n // MutationObserver経由の書き戻し(展開済み値)でテンプレート式を含む既存エントリを上書きしない。\n // (例: href=\"...{{customerCode}}...\" が展開された後にObserverが展開済み値を再セットするのを防ぐ)\n const existing = this.attributeMap.get(rawName);\n if (\n existing &&\n (existing.isEvaluate || existing.isForceEvaluation()) &&\n !contents.isEvaluate &&\n !contents.isForceEvaluation()\n ) {\n this.skipMutationAttributes = true;\n return Queue.enqueue(() => {}).finally(() => {\n this.skipMutationAttributes = false;\n }) as Promise<void>;\n }\n }\n this.attributeMap.set(rawName, contents);\n const element = this.getTarget();\n const detail = contents.evaluateDetailed(this.getBindingData(), {\n kind: 'attribute',\n element,\n rawName,\n template: value,\n });\n const hasTemplateExpression = contents.isEvaluate || contents.isRawEvaluate;\n const isBooleanAttribute =\n rawName === targetName &&\n ElementFragment.BOOLEAN_ATTRIBUTES.has(targetName.toLowerCase());\n const isSingleExpression = contents.isSingleExpression();\n const joinedValue = TextContents.joinEvaluateResults(detail.results);\n const evaluatedValue =\n detail.results.length === 1 ? detail.results[0] : joinedValue;\n const shouldRemoveTarget =\n !contents.isForceEvaluation() &&\n (targetName !== rawName\n ? detail.hasUnresolvedReference ||\n evaluatedValue === null ||\n evaluatedValue === undefined ||\n evaluatedValue === false\n : isBooleanAttribute\n ? detail.hasUnresolvedReference ||\n evaluatedValue === null ||\n evaluatedValue === undefined ||\n evaluatedValue === false\n : isSingleExpression\n ? detail.hasUnresolvedReference ||\n evaluatedValue === null ||\n evaluatedValue === undefined ||\n evaluatedValue === false\n : hasTemplateExpression && joinedValue === '');\n const result = contents.isForceEvaluation()\n ? value\n : isSingleExpression\n ? evaluatedValue\n : joinedValue;\n const shouldSyncValueProperty =\n syncValueProperty &&\n contents.isEvaluate &&\n targetName === 'value' &&\n ((element instanceof HTMLInputElement &&\n this.INPUT_EVENT_TYPES.includes(element.type)) ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement);\n const stringResult =\n shouldRemoveTarget || result === null || result === false\n ? null\n : String(result);\n const requiresRawAttributeWrite =\n rawName !== targetName && element.getAttribute(rawName) !== value;\n const requiresTargetAttributeWrite =\n stringResult === null\n ? element.hasAttribute(targetName)\n : element.getAttribute(targetName) !== stringResult;\n const requiresValuePropertyWrite =\n shouldSyncValueProperty &&\n stringResult !== null &&\n element.value !== stringResult;\n if (\n !requiresRawAttributeWrite &&\n !requiresTargetAttributeWrite &&\n !requiresValuePropertyWrite\n ) {\n if (shouldSyncValueProperty && stringResult !== null) {\n this.value = stringResult;\n }\n return Promise.resolve();\n }\n this.skipMutationAttributes = true;\n return Queue.enqueue(() => {\n if (requiresRawAttributeWrite) {\n element.setAttribute(rawName, value);\n }\n if (stringResult === null) {\n element.removeAttribute(targetName);\n } else {\n if (requiresTargetAttributeWrite) {\n element.setAttribute(targetName, stringResult);\n }\n // element.setAttribute('value', ...) は defaultValue のみ更新するため、\n // setValue と同じ対象には element.value も反映して DOM と内部状態を揃える。\n if (shouldSyncValueProperty) {\n this.value = stringResult;\n if (requiresValuePropertyWrite) {\n element.value = stringResult;\n }\n }\n }\n }).finally(() => {\n this.skipMutationAttributes = false;\n }) as Promise<void>;\n }\n\n /**\n * 属性の値を削除します。\n *\n * @param name 属性名\n * @returns 属性の削除のPromise\n */\n public removeAttribute(name: string): Promise<void> {\n if (this.skipMutationAttributes) {\n return Promise.resolve();\n }\n this.attributeMap.delete(name);\n this.skipMutationAttributes = true;\n const element = this.getTarget();\n return Queue.enqueue(() => {\n element.removeAttribute(name);\n }).finally(() => {\n this.skipMutationAttributes = false;\n }) as Promise<void>;\n }\n\n /**\n * 属性の評価された値を取得します。\n * 複数の評価値がある場合は結合して返します。\n *\n * @param name 属性名\n * @returns 評価された値\n */\n public getAttribute(name: string): string | false | unknown | null {\n const detail = this.getAttributeEvaluation(name);\n return detail?.value ?? null;\n }\n\n /**\n * 属性の評価値と未解決参照の有無を取得します。\n *\n * @param name 属性名\n * @returns 属性評価の詳細。属性が存在しない場合は null\n */\n public getAttributeEvaluation(\n name: string,\n ): AttributeEvaluationDetail | null {\n const contents = this.attributeMap.get(name);\n if (contents === undefined) {\n return null;\n }\n const detail = contents.evaluateDetailed(this.getBindingData(), {\n kind: 'attribute',\n element: this.getTarget(),\n rawName: name,\n template: contents.getValue(),\n });\n if (detail.results.length === 1) {\n return {\n value: detail.results[0],\n hasUnresolvedReference: detail.hasUnresolvedReference,\n };\n }\n return {\n value: TextContents.joinEvaluateResults(detail.results),\n hasUnresolvedReference: detail.hasUnresolvedReference,\n };\n }\n\n /**\n * 属性の生の値を取得します。\n *\n * @param name 属性名\n * @returns 生の属性値\n */\n public getRawAttribute(name: string): string | null {\n const contents = this.attributeMap.get(name);\n if (contents === undefined) {\n return null;\n }\n return contents.getValue();\n }\n\n /**\n * 属性名のリストを取得します。\n *\n * @return 属性名のリスト\n */\n public getAttributeNames(): string[] {\n return Array.from(this.attributeMap.keys());\n }\n\n /**\n * 属性の有無を確認します。\n *\n * @param name 属性名\n * @returns 属性の有無\n */\n public hasAttribute(name: string): boolean {\n return this.attributeMap.has(name);\n }\n\n /**\n * DOM上の順序から、参照フラグメントに対応する children 配列の挿入位置を推定します。\n *\n * @param referenceChild 参照フラグメント\n * @param insertAfter 参照位置の後ろに挿入するかどうか\n * @returns 挿入位置。解決できない場合はnull\n */\n private resolveInsertionPointFromDom(\n referenceChild: Fragment,\n insertAfter: boolean,\n ): {index: number; referenceNode: Node | null} | null {\n const referenceNode = referenceChild.getTarget();\n if (referenceNode.parentNode !== this.target) {\n return null;\n }\n\n const insertionReferenceNode = insertAfter\n ? referenceNode.nextSibling\n : referenceNode;\n\n let nextTrackedNode = insertAfter\n ? referenceNode.nextSibling\n : referenceNode;\n while (nextTrackedNode !== null) {\n const childFragment = Fragment.get(nextTrackedNode);\n if (childFragment !== null) {\n const childIndex = this.children.indexOf(childFragment);\n if (childIndex !== -1) {\n return {index: childIndex, referenceNode: insertionReferenceNode};\n }\n }\n nextTrackedNode = nextTrackedNode.nextSibling;\n }\n\n return {index: this.children.length, referenceNode: insertionReferenceNode};\n }\n\n /**\n * 子ノードを参照ノードの前に挿入します。\n * 参照ノードがnullの場合、親の最後に追加されます。\n *\n * @param newChild 新しい子ノード\n * @param referenceChild 参照ノード\n * @return 挿入のPromise\n */\n public insertBefore(\n newChild: Fragment,\n referenceChild: Fragment | null,\n referenceNodeOverride?: Node | null,\n ): Promise<void> {\n if (this.skipMutationNodes) {\n return Promise.resolve();\n }\n\n // 循環参照チェック\n if (newChild === this) {\n Log.error('[Haori]', 'Cannot insert element as child of itself');\n return Promise.reject(new Error('Self-insertion not allowed'));\n }\n\n // 祖先チェック\n const ancestors = new Set<Fragment>();\n let ancestor = this.parent;\n while (ancestor) {\n ancestors.add(ancestor);\n ancestor = ancestor.getParent();\n }\n if (ancestors.has(newChild)) {\n Log.error('[Haori]', 'Cannot create circular reference');\n return Promise.reject(new Error('Circular reference detected'));\n }\n\n // 同じ親内での移動かどうかを確認\n const isSameParent = newChild.getParent() === this;\n let newChildIndex = -1;\n let referenceIndex = -1;\n\n if (isSameParent) {\n newChildIndex = this.children.indexOf(newChild);\n if (referenceChild !== null) {\n referenceIndex = this.children.indexOf(referenceChild);\n }\n }\n\n const newChildParent = newChild.getParent();\n if (newChildParent !== null) {\n // 既存の親から削除\n newChildParent.removeChild(newChild);\n }\n\n let referenceNode: Node | null =\n referenceNodeOverride === undefined\n ? referenceChild?.getTarget() || null\n : referenceNodeOverride;\n\n if (referenceChild === null) {\n this.children.push(newChild);\n } else {\n let index: number;\n if (isSameParent) {\n // 同じ親内での移動の場合、削除後のインデックスを調整\n if (newChildIndex !== -1 && newChildIndex < referenceIndex) {\n // 削除する要素が参照要素より前にあった場合、インデックスは1つ減る\n index = referenceIndex - 1;\n } else {\n index = referenceIndex;\n }\n } else {\n index = this.children.indexOf(referenceChild);\n }\n\n if (index === -1) {\n const insertionPoint = this.resolveInsertionPointFromDom(\n referenceChild,\n false,\n );\n if (insertionPoint === null) {\n Log.warn(\n '[Haori]',\n 'Reference child not found in children.',\n referenceChild,\n );\n this.children.push(newChild);\n } else {\n this.children.splice(insertionPoint.index, 0, newChild);\n referenceNode = insertionPoint.referenceNode;\n }\n } else {\n this.children.splice(index, 0, newChild);\n }\n }\n\n newChild.setParent(this);\n newChild.setMounted(this.mounted);\n\n const prevSkip = this.skipMutationNodes;\n this.skipMutationNodes = true;\n return Queue.enqueue(() => {\n this.target.insertBefore(newChild.getTarget(), referenceNode);\n }).finally(() => {\n this.skipMutationNodes = prevSkip;\n }) as Promise<void>;\n }\n\n /**\n * 指定した参照ノードの後に子ノードを挿入します。\n *\n * @param newChild 子ノード\n * @param referenceChild 参照ノード\n * @returns 挿入のPromise\n */\n public insertAfter(\n newChild: Fragment,\n referenceChild: Fragment | null,\n ): Promise<void> {\n if (referenceChild == null) {\n return this.insertBefore(newChild, null);\n }\n const index = this.children.indexOf(referenceChild);\n if (index === -1) {\n const insertionPoint = this.resolveInsertionPointFromDom(\n referenceChild,\n true,\n );\n if (insertionPoint === null) {\n Log.warn(\n '[Haori]',\n 'Reference child not found in children.',\n referenceChild,\n );\n return this.insertBefore(newChild, null);\n }\n return this.insertBefore(\n newChild,\n this.children[insertionPoint.index] || null,\n insertionPoint.referenceNode,\n );\n }\n return this.insertBefore(newChild, this.children[index + 1] || null);\n }\n\n /**\n * 前のエレメントフラグメントを取得します。\n * 存在しない場合はnullを返します。\n *\n * @return 前のエレメントフラグメントまたはnull\n */\n public getPrevious(): ElementFragment | null {\n const parent = this.getParent();\n if (parent === null) {\n return null;\n }\n const siblings = parent.getChildElementFragments();\n const index = siblings.indexOf(this);\n if (index <= 0) {\n return null;\n }\n return siblings[index - 1];\n }\n\n /**\n * 次のエレメントフラグメントを取得します。\n * 存在しない場合はnullを返します。\n *\n * @return 次のエレメントフラグメントまたはnull\n */\n public getNext(): ElementFragment | null {\n const parent = this.getParent();\n if (parent === null) {\n return null;\n }\n const siblings = parent.getChildElementFragments();\n const index = siblings.indexOf(this);\n if (index < 0 || index + 1 >= siblings.length) {\n return null;\n }\n return siblings[index + 1];\n }\n\n /**\n * 表示状態を返します。\n *\n * @returns 表示状態\n */\n public isVisible(): boolean {\n return this.visible;\n }\n\n /**\n * エレメントを非表示にします。\n *\n * @returns エレメントの非表示のPromise\n */\n public hide(): Promise<void> {\n if (!this.visible) {\n return Promise.resolve();\n }\n this.visible = false;\n const target = this.getTarget();\n this.display = target.style.getPropertyValue('display');\n this.displayPriority = target.style.getPropertyPriority('display');\n target.style.setProperty('display', 'none', 'important');\n target.setAttribute(`${Env.prefix}if-false`, '');\n return Promise.resolve();\n }\n\n /**\n * エレメントを表示します。\n *\n * @return エレメントの表示のPromise\n */\n public show(): Promise<void> {\n if (this.visible) {\n return Promise.resolve();\n }\n const target = this.getTarget();\n if (this.display === null || this.display === '') {\n target.style.removeProperty('display');\n } else {\n target.style.setProperty(\n 'display',\n this.display,\n this.displayPriority ?? '',\n );\n }\n this.display = null;\n this.displayPriority = null;\n target.removeAttribute(`${Env.prefix}if-false`);\n this.visible = true;\n return Promise.resolve();\n }\n\n /**\n * 指定した属性名を持つ最も近い親要素を返します。\n * 見つからない場合はnullを返します。\n *\n * @param name 属性名\n * @returns 最も近い親要素またはnull\n */\n public closestByAttribute(name: string): ElementFragment | null {\n if (this.hasAttribute(name)) {\n return this;\n }\n const parent = this.getParent();\n if (parent === null) {\n return null;\n }\n return parent.closestByAttribute(name);\n }\n}\n\n/**\n * テキストフラグメント。\n * テキストノードを表現します。\n */\nexport class TextFragment extends Fragment {\n /** 未評価のテキスト文字列 */\n private text: string;\n\n /** コンテンツ */\n private contents: TextContents;\n\n /** 更新スキップフラグ(オブザーバーによる無限ループ対応) */\n private skipMutation = false;\n\n /** 直近に描画した文字列 */\n private renderedText: string | null = null;\n\n /**\n * テキストフラグメントのコンストラクタ。\n * 対象テキストノードの内容を初期化します。\n *\n * @param target 対象テキストノード\n */\n public constructor(target: Text) {\n super(target);\n this.text = target.textContent || '';\n this.contents = new TextContents(this.text);\n }\n\n /**\n * フラグメントをクローンします。\n *\n * @returns クローンされたフラグメント\n */\n public clone(): TextFragment {\n const clone = new TextFragment(this.target.cloneNode(true) as Text);\n clone.mounted = false;\n clone.text = this.text;\n clone.contents = this.contents;\n clone.renderedText = this.renderedText;\n return clone;\n }\n\n /**\n * フラグメントの対象ノードを取得します。\n *\n * @returns フラグメントの対象ノード\n */\n public getTarget(): Text {\n return this.target as Text;\n }\n\n /**\n * テキストに評価式が含まれているかどうかを返します。\n *\n * @returns 評価式を含むなら true\n */\n public hasDynamicContent(): boolean {\n return this.contents.isEvaluate || this.contents.isRawEvaluate;\n }\n\n /**\n * コンテンツを更新します。\n *\n * @param text テキスト\n * @returns 更新のPromise\n */\n public setContent(text: string): Promise<void> {\n if (this.skipMutation || this.text === text) {\n return Promise.resolve();\n }\n this.text = text;\n this.contents = new TextContents(text);\n return this.evaluate();\n }\n\n /**\n * フラグメントを評価します。\n *\n * @returns 評価結果のPromise\n */\n public evaluate(): Promise<void> {\n if (this.contents.isRawEvaluate && this.parent === null) {\n return Promise.reject(\n new Error('Parent fragment is required for raw evaluation'),\n );\n }\n return Queue.enqueue(() => {\n this.skipMutation = true;\n let nextText = this.text;\n if (this.contents.isRawEvaluate) {\n nextText = this.contents.evaluate(\n this.parent!.getBindingData(),\n {\n kind: 'text',\n element: this.parent!.getTarget(),\n childIndex: this.parent!.getChildren().indexOf(this),\n template: this.text,\n },\n )[0] as string;\n } else if (this.contents.isEvaluate) {\n nextText = TextContents.joinEvaluateResults(\n this.contents.evaluate(this.parent!.getBindingData(), {\n kind: 'text',\n element: this.parent!.getTarget(),\n childIndex: this.parent!.getChildren().indexOf(this),\n template: this.text,\n }),\n );\n }\n const currentText = this.contents.isRawEvaluate\n ? this.parent!.getTarget().innerHTML\n : this.target.textContent || '';\n if (this.renderedText === nextText && currentText === nextText) {\n return;\n }\n if (this.contents.isRawEvaluate) {\n this.parent!.getTarget().innerHTML = nextText;\n } else {\n this.target.textContent = nextText;\n }\n this.renderedText = nextText;\n }).finally(() => {\n this.skipMutation = false;\n }) as Promise<void>;\n }\n}\n\n/**\n * コメントフラグメント。\n * コメントノードを表現します。\n */\nexport class CommentFragment extends Fragment {\n /** コメント文字列 */\n private text: string;\n\n /** 更新スキップフラグ(オブザーバーによる無限ループ対応) */\n private skipMutation = false;\n\n /**\n * コメントフラグメントのコンストラクタ。\n * 対象コメントノードの内容を初期化します。\n *\n * @param target 対象コメントノード\n */\n public constructor(target: Comment) {\n super(target);\n this.text = target.textContent || '';\n }\n\n /**\n * フラグメントをクローンします。\n *\n * @returns クローンされたフラグメント\n */\n public clone(): Fragment {\n const clone = new CommentFragment(this.target.cloneNode(true) as Comment);\n clone.mounted = false;\n clone.text = this.text;\n return clone;\n }\n\n /**\n * フラグメントの対象ノードを取得します。\n *\n * @returns フラグメントの対象ノード\n */\n public getTarget(): Comment {\n return this.target as Comment;\n }\n\n /**\n * コンテンツを更新します。\n *\n * @param text テキスト\n * @return 更新のPromise\n */\n public setContent(text: string): Promise<void> {\n if (this.skipMutation || this.text === text) {\n return Promise.resolve();\n }\n this.text = text;\n return Queue.enqueue(() => {\n this.skipMutation = true;\n this.target.textContent = this.text;\n }).finally(() => {\n this.skipMutation = false;\n }) as Promise<void>;\n }\n}\n\n/**\n * 値の種別。\n */\nenum ExpressionType {\n /** テキスト */\n TEXT,\n\n /** 評価式 */\n EXPRESSION,\n\n /** 生の評価式 */\n RAW_EXPRESSION,\n}\n\n/**\n * コンテンツのインターフェース。\n */\ninterface Content {\n /** コンテンツの内容 */\n text: string;\n\n /** 値の種別 */\n type: ExpressionType;\n}\n\n/**\n * テキストコンテンツを管理するクラスです。\n * 一度生成されると内部は変更しません。\n */\nclass TextContents {\n /** プレースホルダ検出用の正規表現 */\n protected static readonly PLACEHOLDER_REGEX =\n /\\{\\{\\{([\\s\\S]+?)\\}\\}\\}|\\{\\{([\\s\\S]+?)\\}\\}/g;\n\n /**\n * 評価結果を結合して文字列にします。\n *\n * @param contents 評価結果の配列\n * @returns 結合された文字列\n */\n public static joinEvaluateResults(contents: unknown[] | null): string {\n if (contents === null || contents.length === 0) {\n return '';\n }\n return contents\n .map(c => {\n if (c === null || c === undefined || c === false || Number.isNaN(c)) {\n return '';\n } else if (typeof c !== 'string') {\n return String(c);\n } else {\n return c;\n }\n })\n .join('');\n }\n\n /** コンテンツのリスト */\n protected readonly contents: Content[] = [];\n\n /** 評価式が含まれるかどうか */\n public readonly isEvaluate: boolean = false;\n\n /** 生の評価式が含まれるかどうか */\n public readonly isRawEvaluate: boolean = false;\n\n /** 評価前の値 */\n private readonly value: string;\n\n /**\n * コンストラクタ。\n *\n * @param text テキスト\n */\n constructor(text: string) {\n this.value = text;\n\n const matches = [...text.matchAll(TextContents.PLACEHOLDER_REGEX)];\n let lastIndex = 0;\n\n let hasEvaluate = false;\n let hasRawEvaluate = false;\n for (const match of matches) {\n // プレースホルダ前の通常テキスト\n if (match.index > lastIndex) {\n this.contents.push({\n text: text.slice(lastIndex, match.index),\n type: ExpressionType.TEXT,\n });\n }\n // プレースホルダ本体\n const content = {\n text: match[1] ?? match[2],\n type: match[1]\n ? ExpressionType.RAW_EXPRESSION\n : ExpressionType.EXPRESSION,\n };\n hasEvaluate = true;\n hasRawEvaluate =\n hasRawEvaluate || content.type === ExpressionType.RAW_EXPRESSION;\n this.contents.push(content);\n lastIndex = match.index! + match[0].length;\n }\n // 最後のプレースホルダ以降の通常テキスト\n if (lastIndex < text.length) {\n this.contents.push({\n text: text.slice(lastIndex),\n type: ExpressionType.TEXT,\n });\n }\n this.isEvaluate = hasEvaluate;\n this.isRawEvaluate = hasRawEvaluate;\n this.checkRawExpressions();\n }\n\n /**\n * 評価前の値を取得します。\n *\n * @returns 評価前の値\n */\n public getValue(): string {\n return this.value;\n }\n\n /**\n * 単体プレースホルダのみで構成されているかどうかを返します。\n *\n * @returns 単体プレースホルダなら true\n */\n public isSingleExpression(): boolean {\n return (\n this.contents.length === 1 &&\n (this.contents[0].type === ExpressionType.EXPRESSION ||\n this.contents[0].type === ExpressionType.RAW_EXPRESSION)\n );\n }\n\n /**\n * RAW_EXPRESSION のチェックを行います。\n */\n protected checkRawExpressions(): void {\n for (let i = 0; i < this.contents.length; i++) {\n const content = this.contents[i];\n if (\n content.type === ExpressionType.RAW_EXPRESSION &&\n this.contents.length > 1\n ) {\n Log.error(\n '[Haori]',\n 'Raw expressions are not allowed in multi-content expressions.',\n );\n this.contents[i].type = ExpressionType.EXPRESSION;\n }\n }\n }\n\n /**\n * 式評価を行い、結果を返します。\n *\n * @param bindingValues バインディングされた値のオブジェクト\n * @returns 評価結果のリスト\n */\n public evaluate(\n bindingValues: Record<string, unknown>,\n profileContext?: EvaluationProfileContext,\n ): unknown[] {\n return this.evaluateDetailed(bindingValues, profileContext).results;\n }\n\n /**\n * 式評価を行い、未解決参照の有無を含む結果を返します。\n *\n * @param bindingValues バインディングされた値のオブジェクト\n * @returns 評価結果と未解決参照の有無\n */\n public evaluateDetailed(\n bindingValues: Record<string, unknown>,\n profileContext?: EvaluationProfileContext,\n ): {\n results: unknown[];\n hasUnresolvedReference: boolean;\n } {\n if (!this.isEvaluate && !this.isRawEvaluate) {\n return {\n results: this.contents.map(c => c.text),\n hasUnresolvedReference: false,\n };\n }\n return this.evaluateWithProfile(\n bindingValues,\n profileContext,\n content =>\n content.type === ExpressionType.EXPRESSION ||\n content.type === ExpressionType.RAW_EXPRESSION,\n 'text',\n );\n }\n\n /**\n * 式評価と profiler 記録をまとめて実行します。\n *\n * @param bindingValues バインディングされた値のオブジェクト\n * @param profileContext profiler 用コンテキスト\n * @param shouldEvaluate 評価対象判定\n * @param errorKind エラーログ種別\n * @returns 評価結果と未解決参照の有無\n */\n protected evaluateWithProfile(\n bindingValues: Record<string, unknown>,\n profileContext: EvaluationProfileContext | undefined,\n shouldEvaluate: (content: Content) => boolean,\n errorKind: 'text' | 'attribute',\n ): {\n results: unknown[];\n hasUnresolvedReference: boolean;\n } {\n const results: unknown[] = [];\n const profileExpressions: Array<{expression: string; durationMs: number}> =\n [];\n let totalDurationMs = 0;\n let hasUnresolvedReference = false;\n this.contents.forEach(content => {\n try {\n if (shouldEvaluate(content)) {\n const measured = EvaluationProfileRegistry.measure(() =>\n Expression.evaluateDetailed(content.text, bindingValues),\n );\n const result = measured.value;\n totalDurationMs += measured.durationMs;\n profileExpressions.push({\n expression: content.text,\n durationMs: measured.durationMs,\n });\n hasUnresolvedReference =\n hasUnresolvedReference || result.unresolvedReference;\n results.push(result.value);\n } else {\n results.push(content.text);\n }\n } catch (error) {\n Log.error(\n '[Haori]',\n `Error evaluating ${errorKind} expression: ${content.text}`,\n error,\n );\n profileExpressions.push({\n expression: content.text,\n durationMs: 0,\n });\n results.push('');\n }\n });\n EvaluationProfileRegistry.record(\n profileContext,\n profileExpressions,\n totalDurationMs,\n );\n return {results, hasUnresolvedReference};\n }\n}\n\n/**\n * 属性のコンテンツを管理するクラスです。\n * 一度生成されると内部は変更しません。\n */\nclass AttributeContents extends TextContents {\n /** 強制評価する属性名 */\n private static readonly FORCE_EVALUATION_ATTRIBUTES = [\n 'data-if',\n 'hor-if',\n 'data-each',\n 'hor-each',\n 'data-derive',\n 'hor-derive',\n ];\n\n /** 強制評価フラグ(プレースホルダでなくても評価する) */\n private readonly forceEvaluation: boolean;\n\n /**\n * コンストラクタ。\n *\n * @param name 属性名\n * @param text 属性値\n */\n constructor(name: string, value: string) {\n super(value);\n this.forceEvaluation =\n AttributeContents.FORCE_EVALUATION_ATTRIBUTES.includes(name);\n }\n\n /**\n * 強制評価フラグを取得します。\n *\n * @returns 強制評価フラグ\n */\n public isForceEvaluation(): boolean {\n return this.forceEvaluation;\n }\n\n /**\n * 式評価を行い、結果を返します。\n *\n * @param bindingValues バインディングされた値のオブジェクト\n * @returns 評価結果のリスト\n */\n public evaluate(\n bindingValues: Record<string, unknown>,\n profileContext?: EvaluationProfileContext,\n ): unknown[] {\n return this.evaluateDetailed(bindingValues, profileContext).results;\n }\n\n /**\n * 式評価を行い、未解決参照の有無を含む結果を返します。\n *\n * @param bindingValues バインディングされた値のオブジェクト\n * @returns 評価結果と未解決参照の有無\n */\n public evaluateDetailed(\n bindingValues: Record<string, unknown>,\n profileContext?: EvaluationProfileContext,\n ): {\n results: unknown[];\n hasUnresolvedReference: boolean;\n } {\n if (!this.isEvaluate && !this.forceEvaluation) {\n return {\n results: this.contents.map(c => c.text),\n hasUnresolvedReference: false,\n };\n }\n const detail = this.evaluateWithProfile(\n bindingValues,\n profileContext,\n content =>\n (this.forceEvaluation && content.type === ExpressionType.TEXT) ||\n content.type === ExpressionType.EXPRESSION ||\n content.type === ExpressionType.RAW_EXPRESSION,\n 'attribute',\n );\n if (this.forceEvaluation && detail.results.length > 1) {\n Log.error(\n '[Haori]',\n 'each or if expressions must have a single content.',\n detail.results,\n );\n return {\n results: [detail.results[0]],\n hasUnresolvedReference: detail.hasUnresolvedReference,\n };\n }\n return detail;\n }\n}\n","/**\n * @fileoverview Haoriイベント発火ユーティリティ\n *\n * Haoriライブラリが発火するカスタムイベントの統一的な発火機能を提供します。\n */\n\nimport type {HaoriRuntime} from './env';\n\n/**\n * Haoriイベントを発火するユーティリティクラス\n */\nexport interface FetchStartMetadata {\n /** 実行モード。 */\n runtime?: HaoriRuntime;\n /** 属性で指定された元の HTTP メソッド。 */\n requestedMethod?: string;\n /** 実際の通信に使う HTTP メソッド。 */\n effectiveMethod?: string;\n /** 通信方式。 */\n transportMode?: string;\n /** クエリ化後の検索文字列。 */\n queryString?: string;\n}\n\nexport default class HaoriEvent {\n /**\n * カスタムイベントを発火します。\n *\n * @param target イベントを発火する対象要素\n * @param eventName イベント名(haori:プレフィックスは自動追加)\n * @param detail イベントの詳細データ\n * @param options イベントオプション\n */\n public static dispatch(\n target: EventTarget,\n eventName: string,\n detail?: unknown,\n options?: {\n bubbles?: boolean;\n cancelable?: boolean;\n composed?: boolean;\n },\n ): boolean {\n const event = new CustomEvent(`haori:${eventName}`, {\n bubbles: options?.bubbles ?? true,\n cancelable: options?.cancelable ?? false,\n composed: options?.composed ?? true,\n detail,\n });\n\n return target.dispatchEvent(event);\n }\n\n /**\n * readyイベントを発火します。\n *\n * @param version ライブラリバージョン\n */\n public static ready(version?: string): void {\n HaoriEvent.dispatch(document, 'ready', {version});\n }\n\n /**\n * renderイベントを発火します。\n *\n * @param target 評価対象要素\n */\n public static render(target: HTMLElement): void {\n HaoriEvent.dispatch(target, 'render', {target});\n }\n\n /**\n * importstartイベントを発火します。\n *\n * @param target data-import要素\n * @param url インポート対象URL\n */\n public static importStart(target: HTMLElement, url: string): void {\n HaoriEvent.dispatch(target, 'importstart', {\n url,\n startedAt: performance.now(),\n });\n }\n\n /**\n * importendイベントを発火します。\n *\n * @param target data-import要素\n * @param url インポート対象URL\n * @param bytes 取得バイト数\n * @param startedAt 開始時刻\n */\n public static importEnd(\n target: HTMLElement,\n url: string,\n bytes: number,\n startedAt: number,\n ): void {\n HaoriEvent.dispatch(target, 'importend', {\n url,\n bytes,\n durationMs: performance.now() - startedAt,\n });\n }\n\n /**\n * importerrorイベントを発火します。\n *\n * @param target data-import要素\n * @param url インポート対象URL\n * @param error エラー内容\n */\n public static importError(\n target: HTMLElement,\n url: string,\n error: unknown,\n ): void {\n HaoriEvent.dispatch(target, 'importerror', {url, error});\n }\n\n /**\n * bindchangeイベントを発火します。\n *\n * @param target バインド対象要素\n * @param previous 変更前のデータ\n * @param next 変更後のデータ\n * @param reason 変更理由\n */\n public static bindChange(\n target: HTMLElement,\n previous: Record<string, unknown> | null,\n next: Record<string, unknown>,\n reason: 'form' | 'fetch' | 'manual' | 'import' | 'other' = 'other',\n ): void {\n const changedKeys: string[] = [];\n\n // 変更されたキーを検出\n const prevKeys = new Set(Object.keys(previous || {}));\n const nextKeys = new Set(Object.keys(next));\n const allKeys = new Set([...prevKeys, ...nextKeys]);\n\n for (const key of allKeys) {\n const prevValue = previous?.[key];\n const nextValue = next[key];\n if (prevValue !== nextValue) {\n changedKeys.push(key);\n }\n }\n\n HaoriEvent.dispatch(target, 'bindchange', {\n previous: previous || {},\n next,\n changedKeys,\n reason,\n });\n }\n\n /**\n * eachupdateイベントを発火します。\n *\n * @param target data-each要素\n * @param added 追加された行のキー\n * @param removed 削除された行のキー\n * @param order 現在の順序\n */\n public static eachUpdate(\n target: HTMLElement,\n added: string[],\n removed: string[],\n order: string[],\n ): void {\n HaoriEvent.dispatch(target, 'eachupdate', {\n added,\n removed,\n order,\n total: order.length,\n });\n }\n\n /**\n * rowaddイベントを発火します。\n *\n * @param target 行要素\n * @param key 行キー\n * @param index インデックス\n * @param item 行データ\n */\n public static rowAdd(\n target: HTMLElement,\n key: string,\n index: number,\n item: unknown,\n ): void {\n HaoriEvent.dispatch(target, 'rowadd', {key, index, item});\n }\n\n /**\n * rowremoveイベントを発火します。\n *\n * @param target 行要素\n * @param key 行キー\n * @param index インデックス\n */\n public static rowRemove(\n target: HTMLElement,\n key: string,\n index: number,\n ): void {\n HaoriEvent.dispatch(target, 'rowremove', {key, index});\n }\n\n /**\n * rowmoveイベントを発火します。\n *\n * @param target 行要素\n * @param key 行キー\n * @param from 移動前インデックス\n * @param to 移動後インデックス\n */\n public static rowMove(\n target: HTMLElement,\n key: string,\n from: number,\n to: number,\n ): void {\n HaoriEvent.dispatch(target, 'rowmove', {key, from, to});\n }\n\n /**\n * showイベントを発火します。\n *\n * @param target data-if要素\n */\n public static show(target: HTMLElement): void {\n HaoriEvent.dispatch(target, 'show', {visible: true});\n }\n\n /**\n * hideイベントを発火します。\n *\n * @param target data-if要素\n */\n public static hide(target: HTMLElement): void {\n HaoriEvent.dispatch(target, 'hide', {visible: false});\n }\n\n /**\n * fetchstartイベントを発火します。\n *\n * @param target 起点要素\n * @param url フェッチURL\n * @param options フェッチオプション\n * @param payload 送信データ\n * @param metadata runtime とメソッド変換情報。\n * @return 戻り値はありません。\n */\n public static fetchStart(\n target: HTMLElement,\n url: string,\n options?: RequestInit,\n payload?: Record<string, unknown>,\n metadata?: FetchStartMetadata,\n ): void {\n HaoriEvent.dispatch(target, 'fetchstart', {\n url,\n options: options || {},\n payload,\n startedAt: performance.now(),\n ...metadata,\n });\n }\n\n /**\n * fetchendイベントを発火します。\n *\n * @param target 起点要素\n * @param url フェッチURL\n * @param status HTTPステータス\n * @param startedAt 開始時刻\n */\n public static fetchEnd(\n target: HTMLElement,\n url: string,\n status: number,\n startedAt: number,\n ): void {\n HaoriEvent.dispatch(target, 'fetchend', {\n url,\n status,\n durationMs: performance.now() - startedAt,\n });\n }\n\n /**\n * fetcherrorイベントを発火します。\n *\n * @param target 起点要素\n * @param url フェッチURL\n * @param error エラー内容\n * @param status HTTPステータス(存在する場合)\n * @param startedAt 開始時刻(存在する場合)\n */\n public static fetchError(\n target: HTMLElement,\n url: string,\n error: unknown,\n status?: number,\n startedAt?: number,\n ): void {\n HaoriEvent.dispatch(target, 'fetcherror', {\n url,\n status,\n error,\n durationMs: startedAt ? performance.now() - startedAt : undefined,\n });\n }\n}\n","/**\n * @fileoverview 手続き的処理管理機能\n *\n * イベントに基づく手続き的な処理を提供します。\n */\n\nimport Core from './core';\nimport Env from './env';\nimport Expression from './expression';\nimport Form from './form';\nimport Fragment, {ElementFragment} from './fragment';\nimport Haori from './haori';\nimport Log from './log';\nimport HaoriEvent from './event';\n\ntype ProcedureHaoriApi = Pick<\n typeof Haori,\n | 'addErrorMessage'\n | 'closeDialog'\n | 'confirm'\n | 'dialog'\n | 'openDialog'\n | 'toast'\n>;\n\nconst PROCEDURE_HAORI_METHOD_NAMES = [\n 'addErrorMessage',\n 'closeDialog',\n 'confirm',\n 'dialog',\n 'openDialog',\n 'toast',\n] as const;\n\nconst PROCEDURE_HISTORY_STATE_KEY = '__haoriHistoryState__';\n\n/** click ロック中であることを示す内部マーカー属性名 */\nconst PROCEDURE_CLICK_LOCK_MARKER = 'data-haori-click-lock';\n\n/**\n * Procedure から利用する Haori API を解決します。\n * window.Haori が差し替えられている場合はそちらを優先します。\n *\n * @returns Procedure が使用する Haori API。\n */\nfunction resolveProcedureHaoriApi(): ProcedureHaoriApi {\n const scope = globalThis as typeof globalThis & {\n window?: Window & {Haori?: unknown};\n };\n const candidate = scope.window?.Haori;\n const hasRequiredMethods = PROCEDURE_HAORI_METHOD_NAMES.every(\n methodName =>\n typeof (candidate as Record<string, unknown> | undefined)?.[\n methodName\n ] === 'function',\n );\n return hasRequiredMethods ? (candidate as ProcedureHaoriApi) : Haori;\n}\n\nconst QUERY_TRANSPORT_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);\n\n/**\n * URL クエリ化の対象メソッドかどうかを判定します。\n *\n * @param method 判定対象の HTTP メソッド。\n * @return クエリ送信対象なら true。\n */\nfunction isQueryTransportMethod(method: string): boolean {\n return QUERY_TRANSPORT_METHODS.has(method.toUpperCase());\n}\n\n/**\n * 送信データを URLSearchParams に追加します。\n *\n * @param params 追加先の URLSearchParams。\n * @param payload 追加対象の送信データ。\n * @return 戻り値はありません。\n */\nfunction appendPayloadToSearchParams(\n params: URLSearchParams,\n payload: Record<string, unknown>,\n): void {\n for (const [key, value] of Object.entries(payload)) {\n if (value === undefined) {\n continue;\n }\n if (value === null) {\n params.append(key, '');\n } else if (Array.isArray(value)) {\n value.forEach(item => {\n params.append(key, String(item));\n });\n } else if (typeof value === 'object' || typeof value === 'function') {\n params.append(key, JSON.stringify(value));\n } else {\n params.append(key, String(value));\n }\n }\n}\n\n/**\n * 送信データをクエリ文字列へ付加した URL を返します。\n *\n * @param fetchUrl 元のフェッチ URL。\n * @param payload 追加対象の送信データ。\n * @return クエリ文字列を付加した URL。\n */\nfunction appendPayloadToUrl(\n fetchUrl: string,\n payload: Record<string, unknown>,\n): string {\n const url = new URL(fetchUrl, window.location.href);\n const params = new URLSearchParams(url.search);\n appendPayloadToSearchParams(params, payload);\n url.search = params.toString();\n return url.toString();\n}\n\n/**\n * 自動再評価用に解決したフェッチシグネチャです。\n */\nexport interface ResolvedFetchSignature {\n /** 比較用シグネチャ。無効な場合は null */\n signature: string | null;\n\n /** 未解決参照が含まれていたかどうか */\n hasUnresolvedReference: boolean;\n}\n\ninterface ResolvedDataAttribute {\n value: Record<string, unknown> | null;\n hasUnresolvedReference: boolean;\n}\n\ninterface PreparedFetchRequest {\n url: string | null;\n options: RequestInit | null;\n payload: Record<string, unknown>;\n hasUnresolvedReference: boolean;\n requestedMethod: string;\n effectiveMethod: string;\n queryString?: string;\n transportMode: 'http' | 'query-get';\n signature: string | null;\n}\n\ninterface PayloadResolution {\n payload: Record<string, unknown>;\n hasUnresolvedReference: boolean;\n}\n\nfunction normalizeRequestBody(body: BodyInit | null | undefined): unknown {\n if (body === undefined || body === null) {\n return null;\n }\n if (typeof body === 'string') {\n return body;\n }\n if (body instanceof URLSearchParams) {\n return body.toString();\n }\n if (body instanceof FormData) {\n return Array.from(body.entries()).map(([key, value]) => {\n if (value instanceof File) {\n return [\n key,\n {\n type: 'file',\n name: value.name,\n size: value.size,\n mimeType: value.type,\n },\n ];\n }\n return [key, String(value)];\n });\n }\n return String(body);\n}\n\nfunction buildFetchSignature(url: string, options: RequestInit): string {\n const headers = new Headers(\n (options.headers as HeadersInit | undefined) || undefined,\n );\n const normalizedHeaders = Array.from(headers.entries()).sort(([a], [b]) =>\n a.localeCompare(b),\n );\n return JSON.stringify({\n url,\n method: String(options.method || 'GET').toUpperCase(),\n headers: normalizedHeaders,\n body: normalizeRequestBody((options.body as BodyInit | undefined) || null),\n });\n}\n\n/**\n * フェッチ前実行スクリプト戻り値型。\n */\nexport interface BeforeCallbackResult {\n /** 処理を停止する場合は true */\n stop?: boolean;\n\n /** 上書きするフェッチURL */\n fetchUrl?: string | null;\n\n /** 上書きするフェッチオプション */\n fetchOptions?: RequestInit | null;\n}\n\n/**\n * フェッチ後実行スクリプト戻り値型。\n */\nexport interface AfterCallbackResult {\n /** 処理を停止する場合は true */\n stop?: boolean;\n\n /** レスポンスとして使用するデータ */\n response?: Response;\n}\n\n/**\n * Procedureクラスのオプションインターフェース。\n */\nexport interface ProcedureOptions {\n /** 処理対象のフラグメント */\n targetFragment?: ElementFragment;\n\n /** バリデーションを行うかどうか */\n valid?: boolean;\n\n /** 確認メッセージ */\n confirmMessage?: string | null;\n\n /** 送信もしくは受信データ */\n data?: Record<string, unknown> | null;\n\n /** data 属性の評価元となる属性名 */\n dataAttrName?: string | null;\n\n /** フェッチ前実行スクリプト */\n beforeCallback?: (\n fetchUrl: string | null,\n fetchOptions: RequestInit | null,\n ) => BeforeCallbackResult | boolean | void;\n\n /** 対象フォームフラグメント */\n formFragment?: ElementFragment | null;\n\n /** フェッチURL */\n fetchUrl?: string | null;\n\n /** フェッチ関連属性に未解決参照が含まれていたかどうか */\n fetchHasUnresolvedReference?: boolean | null;\n\n /** フェッチオプション */\n fetchOptions?: RequestInit | null;\n\n /** バインド対象フラグメント */\n bindFragments?: ElementFragment[] | null;\n\n /** レスポンスデータから抽出するパラメータ名のリスト */\n bindParams?: string[] | null;\n\n /** レスポンスデータのうち既存配列へ追記するパラメータ名のリスト */\n bindAppendParams?: string[] | null;\n\n /** レスポンスデータをバインドする際のキー名 */\n bindArg?: string | null;\n\n /** フェッチ後実行スクリプト */\n afterCallback?: (\n response: Response | Record<string, unknown>,\n ) => AfterCallbackResult | boolean | void;\n\n /** 値を変更するフラグメント */\n adjustFragments?: ElementFragment[] | null;\n\n /** 変更する値の増減値 */\n adjustValue?: number | null;\n\n /** 行追加の有無 */\n rowAdd?: boolean | null;\n\n /** 行削除の有無 */\n rowRemove?: boolean | null;\n\n /** 前の行へ移動するかどうか */\n rowMovePrev?: boolean | null;\n\n /** 次の行へ移動するかどうか */\n rowMoveNext?: boolean | null;\n\n /** 送信前にリセットするフラグメント */\n resetBeforeFragments?: ElementFragment[] | null;\n\n /** リセットするフラグメント */\n resetFragments?: ElementFragment[] | null;\n\n /** 再フェッチするフラグメント */\n refetchFragments?: ElementFragment[] | null;\n\n /** クリックするフラグメント */\n clickFragments?: ElementFragment[] | null;\n\n /** ダイアログを開くフラグメント */\n openFragments?: ElementFragment[] | null;\n\n /** ダイアログを閉じるフラグメント */\n closeFragments?: ElementFragment[] | null;\n\n /** コピー先フラグメント */\n copyFragments?: ElementFragment[] | null;\n\n /** コピー元フラグメント(data-click-copy-source で指定) */\n copySourceFragment?: ElementFragment | null;\n\n /** コピー対象パラメータ名のリスト */\n copyParams?: string[] | null;\n\n /** ダイアログメッセージ */\n dialogMessage?: string | null;\n\n /** トーストメッセージ */\n toastMessage?: string | null;\n\n /** トーストレベル */\n toastLevel?: 'info' | 'warning' | 'error' | 'success' | null;\n\n /** history.pushState で追加する URL */\n historyUrl?: string | null;\n\n /** history.pushState の URL に追記するクエリパラメータ */\n historyData?: Record<string, unknown> | null;\n\n /** history.pushState の URL に追記するクエリパラメータの評価元属性名 */\n historyDataAttrName?: string | null;\n\n /** reset-before 後に確定した historyData のスナップショット */\n historyDataSnapshot?: Record<string, unknown> | null;\n\n /** history.pushState の URL に追記するフォームフラグメント */\n historyFormFragment?: ElementFragment | null;\n\n /** reset-before 後に確定した historyForm のスナップショット */\n historyFormSnapshot?: Record<string, unknown> | null;\n\n /** リダイレクトURL */\n redirectUrl?: string | null;\n\n /** エラー時に最初のエラー要素へスクロールするかどうか */\n scrollOnError?: boolean | null;\n\n /** 成功時にスクロールする要素のCSSセレクター */\n scrollTarget?: string | null;\n}\n\ninterface ExecutionLockState {\n /** 実行中として扱う対象要素 */\n target: HTMLElement;\n\n /** 今回の処理で disabled 属性を付与したかどうか */\n appliedDisabledAttribute: boolean;\n}\n\n/**\n * 手続き的処理管理クラスです。\n */\nexport default class Procedure {\n /** data 属性内のテンプレート式検出用正規表現 */\n private static readonly DATA_PLACEHOLDER_REGEX =\n /\\{\\{\\{([\\s\\S]+?)\\}\\}\\}|\\{\\{([\\s\\S]+?)\\}\\}/g;\n\n /** 属性全体が単一テンプレート式かを判定する正規表現 */\n private static readonly SINGLE_PLACEHOLDER_REGEX =\n /^(\\{\\{\\{[\\s\\S]+?\\}\\}\\}|\\{\\{[\\s\\S]+?\\}\\})$/;\n\n /** click 手続きの再入を防ぐ対象要素の集合 */\n private static readonly RUNNING_CLICK_TARGETS = new WeakSet<HTMLElement>();\n\n /** この Procedure が扱うイベント種別 */\n private readonly eventType: string | null;\n\n /**\n * イベント属性名を正しく生成します。\n * 例: (\"click\", \"fetch\") => \"data-click-fetch\"\n * (null, \"fetch\") => \"data-fetch\"\n * (\"change\", \"bind-arg\") => \"data-change-bind-arg\"\n * 非イベント変種が \"data-fetch-xxx\" として存在するものについては、event が null の場合にそちらを返します。\n */\n private static attrName(\n event: string | null,\n key: string,\n hasFetchFallback: boolean = false,\n ): string {\n if (event) {\n return `${Env.prefix}${event}-${key}`;\n }\n return hasFetchFallback\n ? `${Env.prefix}fetch-${key}`\n : `${Env.prefix}${key}`;\n }\n\n /**\n * data 属性のテンプレート式評価結果を URLSearchParams 向けに組み立てます。\n *\n * @param rawAttribute 生の属性値\n * @param bindingValues バインディング値\n * @returns パラメータ形式として扱える文字列\n */\n private static resolveDataParamString(\n rawAttribute: string,\n bindingValues: Record<string, unknown>,\n ): string {\n return Procedure.resolveDataParamStringDetailed(rawAttribute, bindingValues)\n .value;\n }\n\n /**\n * data 属性のテンプレート式評価結果を URLSearchParams 向けに組み立てます。\n *\n * @param rawAttribute 生の属性値\n * @param bindingValues バインディング値\n * @returns パラメータ形式として扱える文字列と未解決参照の有無\n */\n private static resolveDataParamStringDetailed(\n rawAttribute: string,\n bindingValues: Record<string, unknown>,\n ): {value: string; hasUnresolvedReference: boolean} {\n let hasUnresolvedReference = false;\n const value = rawAttribute.replace(\n Procedure.DATA_PLACEHOLDER_REGEX,\n (\n _matched: string,\n rawExpression: string | undefined,\n expression: string | undefined,\n ): string => {\n const result = Expression.evaluateDetailed(\n rawExpression ?? expression ?? '',\n bindingValues,\n );\n hasUnresolvedReference =\n hasUnresolvedReference || result.unresolvedReference;\n if (\n result.value === null ||\n result.value === undefined ||\n Number.isNaN(result.value)\n ) {\n return '';\n }\n if (typeof result.value === 'object') {\n return encodeURIComponent(JSON.stringify(result.value));\n }\n return encodeURIComponent(String(result.value));\n },\n );\n return {value, hasUnresolvedReference};\n }\n\n /**\n * JSON 文字列中のテンプレート式かどうかを判定します。\n *\n * @param source 生の属性値\n * @param offset プレースホルダ開始位置\n * @returns JSON 文字列中なら true\n */\n private static isJsonStringContext(source: string, offset: number): boolean {\n let inString = false;\n let escaped = false;\n for (let index = 0; index < offset; index += 1) {\n const char = source[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (char === '\\\\') {\n escaped = true;\n continue;\n }\n if (char === '\"') {\n inString = !inString;\n }\n }\n return inString;\n }\n\n /**\n * JSON 値コンテキスト向けにテンプレート式の評価結果を直列化します。\n *\n * @param result テンプレート式の評価結果\n * @returns JSON 値として埋め込める文字列\n */\n private static stringifyJsonTemplateValue(result: unknown): string {\n if (result === undefined || Number.isNaN(result)) {\n return 'null';\n }\n try {\n const serialized = JSON.stringify(result);\n return serialized ?? JSON.stringify(String(result));\n } catch {\n return JSON.stringify(String(result));\n }\n }\n\n /**\n * JSON 文字列コンテキスト向けにテンプレート式の評価結果を直列化します。\n *\n * @param result テンプレート式の評価結果\n * @returns JSON 文字列へ安全に埋め込める文字列\n */\n private static stringifyJsonTemplateStringContent(result: unknown): string {\n if (result === null || result === undefined || Number.isNaN(result)) {\n return '';\n }\n const value =\n typeof result === 'object'\n ? Procedure.stringifyJsonTemplateValue(result)\n : String(result);\n return JSON.stringify(value).slice(1, -1);\n }\n\n /**\n * JSON 形式 data 属性内のテンプレート式を安全に解決します。\n *\n * @param rawAttribute 生の属性値\n * @param bindingValues バインディング値\n * @returns JSON として解釈可能な文字列\n */\n private static resolveDataJsonString(\n rawAttribute: string,\n bindingValues: Record<string, unknown>,\n ): string {\n return Procedure.resolveDataJsonStringDetailed(rawAttribute, bindingValues)\n .value;\n }\n\n /**\n * JSON 形式 data 属性内のテンプレート式を安全に解決します。\n *\n * @param rawAttribute 生の属性値\n * @param bindingValues バインディング値\n * @returns JSON として解釈可能な文字列と未解決参照の有無\n */\n private static resolveDataJsonStringDetailed(\n rawAttribute: string,\n bindingValues: Record<string, unknown>,\n ): {value: string; hasUnresolvedReference: boolean} {\n let hasUnresolvedReference = false;\n const value = rawAttribute.replace(\n Procedure.DATA_PLACEHOLDER_REGEX,\n (\n _matched: string,\n rawExpression: string | undefined,\n expression: string | undefined,\n offset: number,\n ): string => {\n const result = Expression.evaluateDetailed(\n rawExpression ?? expression ?? '',\n bindingValues,\n );\n hasUnresolvedReference =\n hasUnresolvedReference || result.unresolvedReference;\n return Procedure.isJsonStringContext(rawAttribute, offset)\n ? Procedure.stringifyJsonTemplateStringContent(result.value)\n : Procedure.stringifyJsonTemplateValue(result.value);\n },\n );\n return {value, hasUnresolvedReference};\n }\n\n /**\n * data 属性を評価済みの値として取得します。\n *\n * @param fragment フラグメント\n * @param attrName 属性名\n * @returns 送信データ\n */\n private static resolveDataAttribute(\n fragment: ElementFragment,\n attrName: string,\n ): Record<string, unknown> | null {\n return Procedure.resolveDataAttributeDetailed(fragment, attrName).value;\n }\n\n /**\n * data 属性を評価済みの値として取得し、未解決参照の有無を返します。\n *\n * @param fragment フラグメント\n * @param attrName 属性名\n * @returns 送信データと未解決参照の有無\n */\n private static resolveDataAttributeDetailed(\n fragment: ElementFragment,\n attrName: string,\n ): ResolvedDataAttribute {\n const rawAttribute = fragment.getRawAttribute(attrName);\n const attributeEvaluation = fragment.getAttributeEvaluation(attrName);\n const dataAttribute = attributeEvaluation?.value ?? null;\n const hasUnresolvedReference =\n attributeEvaluation?.hasUnresolvedReference ?? false;\n if (\n dataAttribute &&\n typeof dataAttribute === 'object' &&\n !Array.isArray(dataAttribute)\n ) {\n return {\n value: dataAttribute as Record<string, unknown>,\n hasUnresolvedReference,\n };\n }\n if (typeof dataAttribute !== 'string' || rawAttribute === null) {\n return {value: null, hasUnresolvedReference};\n }\n const trimmed = rawAttribute.trim();\n if (Procedure.SINGLE_PLACEHOLDER_REGEX.test(trimmed)) {\n return {\n value: Core.parseDataBind(dataAttribute),\n hasUnresolvedReference,\n };\n }\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n const resolved = Procedure.resolveDataJsonStringDetailed(\n rawAttribute,\n fragment.getBindingData(),\n );\n return {\n value: Core.parseDataBind(resolved.value),\n hasUnresolvedReference:\n hasUnresolvedReference || resolved.hasUnresolvedReference,\n };\n }\n const resolved = Procedure.resolveDataParamStringDetailed(\n rawAttribute,\n fragment.getBindingData(),\n );\n return {\n value: Core.parseDataBind(resolved.value),\n hasUnresolvedReference:\n hasUnresolvedReference || resolved.hasUnresolvedReference,\n };\n }\n\n /**\n * オプションをフラグメントの属性から構築します。\n *\n * @param fragment フラグメント\n * @param event イベント名\n * @return 構築されたオプション\n */\n private static buildOptions(\n fragment: ElementFragment,\n event: string | null,\n ): ProcedureOptions {\n const options: ProcedureOptions = {\n targetFragment: fragment,\n };\n if (event) {\n // validate(spec: data-???-validate)\n if (fragment.hasAttribute(Procedure.attrName(event, 'validate'))) {\n options.valid = true;\n }\n // confirm\n if (fragment.hasAttribute(Procedure.attrName(event, 'confirm'))) {\n options.confirmMessage = (\n fragment.getAttribute(Procedure.attrName(event, 'confirm')) as string\n ).replace(/\\\\n/g, '\\n');\n }\n // data(イベント)\n if (fragment.hasAttribute(Procedure.attrName(event, 'data'))) {\n options.dataAttrName = Procedure.attrName(event, 'data');\n }\n // form(イベント)\n if (fragment.hasAttribute(Procedure.attrName(event, 'form'))) {\n const formSelector = fragment.getRawAttribute(\n Procedure.attrName(event, 'form'),\n ) as string | null;\n if (formSelector) {\n const formElement = document.body.querySelector(formSelector);\n if (formElement !== null) {\n options.formFragment = Form.getFormFragment(\n Fragment.get(formElement) as ElementFragment,\n );\n } else {\n Log.error(\n 'Haori',\n `Form element not found: ${formSelector}` +\n ` (${Procedure.attrName(event, 'form')})`,\n );\n }\n } else {\n // 属性はあるが値が省略された場合は自要素もしくは先祖の form を対象\n options.formFragment = Form.getFormFragment(fragment);\n }\n } else if (event === 'change') {\n // changeイベントの場合、data-change-form属性がなくても自動的にフォームを検索\n options.formFragment = Form.getFormFragment(fragment);\n }\n if (fragment.hasAttribute(`${Env.prefix}${event}-before-run`)) {\n const body = fragment.getRawAttribute(\n `${Env.prefix}${event}-before-run`,\n ) as string;\n try {\n options.beforeCallback = new Function(\n 'fetchUrl',\n 'fetchOptions',\n `\n\"use strict\";\n${body}\n`,\n ) as (\n fetchUrl: string | null,\n fetchOptions: RequestInit | null,\n ) => BeforeCallbackResult | boolean | void;\n } catch (e) {\n Log.error('Haori', `Invalid before script: ${e}`);\n }\n }\n }\n // fetch URL(イベントあり/なし)\n const fetchAttrName = Procedure.attrName(event, 'fetch');\n const hasFetchAttr = fragment.hasAttribute(fetchAttrName);\n if (hasFetchAttr) {\n const fetchEvaluation = fragment.getAttributeEvaluation(fetchAttrName);\n if (fetchEvaluation) {\n options.fetchHasUnresolvedReference =\n fetchEvaluation.hasUnresolvedReference;\n options.fetchUrl = fetchEvaluation.hasUnresolvedReference\n ? null\n : (fetchEvaluation.value as string | null);\n }\n }\n const fetchOptions: RequestInit = {};\n // fetch-method(イベントあり/なし)\n // event: data-{event}-fetch-method, non-event: data-fetch-method\n if (event) {\n const fetchMethodAttrEvent = Procedure.attrName(event, 'fetch-method');\n if (fragment.hasAttribute(fetchMethodAttrEvent)) {\n const fetchMethodEvaluation =\n fragment.getAttributeEvaluation(fetchMethodAttrEvent);\n if (fetchMethodEvaluation?.hasUnresolvedReference) {\n options.fetchHasUnresolvedReference = true;\n } else {\n fetchOptions.method = fetchMethodEvaluation?.value as string;\n }\n }\n } else {\n const fetchMethodAttrNonEvent = Procedure.attrName(null, 'method', true);\n if (fragment.hasAttribute(fetchMethodAttrNonEvent)) {\n const fetchMethodEvaluation = fragment.getAttributeEvaluation(\n fetchMethodAttrNonEvent,\n );\n if (fetchMethodEvaluation?.hasUnresolvedReference) {\n options.fetchHasUnresolvedReference = true;\n } else {\n fetchOptions.method = fetchMethodEvaluation?.value as string;\n }\n }\n }\n // fetch-headers(イベントあり/なし)\n // event: data-{event}-fetch-headers, non-event: data-fetch-headers\n if (event) {\n const fetchHeadersAttrEvent = Procedure.attrName(event, 'fetch-headers');\n if (fragment.hasAttribute(fetchHeadersAttrEvent)) {\n const headersString = fragment.getRawAttribute(\n fetchHeadersAttrEvent,\n ) as string;\n try {\n fetchOptions.headers = Core.parseDataBind(headersString) as Record<\n string,\n string\n >;\n } catch (e) {\n Log.error('Haori', `Invalid fetch headers: ${e}`);\n }\n }\n } else {\n const fetchHeadersAttrNonEvent = Procedure.attrName(\n null,\n 'headers',\n true,\n );\n if (fragment.hasAttribute(fetchHeadersAttrNonEvent)) {\n const headersString = fragment.getRawAttribute(\n fetchHeadersAttrNonEvent,\n ) as string;\n try {\n fetchOptions.headers = Core.parseDataBind(headersString) as Record<\n string,\n string\n >;\n } catch (e) {\n Log.error('Haori', `Invalid fetch headers: ${e}`);\n }\n }\n }\n // fetch-content-type(イベントあり/なし)\n // event: data-{event}-fetch-content-type\n // non-event: data-fetch-content-type\n if (event) {\n const fetchCTAttrEvent = Procedure.attrName(event, 'fetch-content-type');\n if (fragment.hasAttribute(fetchCTAttrEvent)) {\n const fetchContentTypeEvaluation =\n fragment.getAttributeEvaluation(fetchCTAttrEvent);\n if (fetchContentTypeEvaluation?.hasUnresolvedReference) {\n options.fetchHasUnresolvedReference = true;\n }\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': fetchContentTypeEvaluation?.value as string,\n };\n } else if (\n fetchOptions.method &&\n fetchOptions.method !== 'GET' &&\n fetchOptions.method !== 'HEAD' &&\n fetchOptions.method !== 'OPTIONS'\n ) {\n // only set default Content-Type when one is not already provided\n let hasContentType = false;\n if (fetchOptions.headers && typeof fetchOptions.headers === 'object') {\n const headersObj = fetchOptions.headers as Record<string, unknown>;\n hasContentType = 'Content-Type' in headersObj;\n }\n if (!hasContentType) {\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': 'application/json',\n };\n }\n } else if (\n fetchOptions.method &&\n (fetchOptions.method === 'GET' ||\n fetchOptions.method === 'HEAD' ||\n fetchOptions.method === 'OPTIONS')\n ) {\n // 仕様: GET/HEAD/OPTIONS 既定は application/x-www-form-urlencoded\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': 'application/x-www-form-urlencoded',\n };\n }\n } else {\n const fetchCTAttrNonEvent = Procedure.attrName(\n null,\n 'content-type',\n true,\n );\n if (fragment.hasAttribute(fetchCTAttrNonEvent)) {\n const fetchContentTypeEvaluation =\n fragment.getAttributeEvaluation(fetchCTAttrNonEvent);\n if (fetchContentTypeEvaluation?.hasUnresolvedReference) {\n options.fetchHasUnresolvedReference = true;\n }\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': fetchContentTypeEvaluation?.value as string,\n };\n } else if (\n fetchOptions.method &&\n fetchOptions.method !== 'GET' &&\n fetchOptions.method !== 'HEAD' &&\n fetchOptions.method !== 'OPTIONS'\n ) {\n // only set default Content-Type when one is not already provided\n let hasContentType = false;\n if (fetchOptions.headers && typeof fetchOptions.headers === 'object') {\n const headersObj = fetchOptions.headers as Record<string, unknown>;\n hasContentType = 'Content-Type' in headersObj;\n }\n if (!hasContentType) {\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': 'application/json',\n };\n }\n } else if (\n fetchOptions.method &&\n (fetchOptions.method === 'GET' ||\n fetchOptions.method === 'HEAD' ||\n fetchOptions.method === 'OPTIONS')\n ) {\n // 仕様: GET/HEAD/OPTIONS 既定は application/x-www-form-urlencoded\n fetchOptions.headers = {\n ...fetchOptions.headers,\n 'Content-Type': 'application/x-www-form-urlencoded',\n };\n }\n }\n if (Object.keys(fetchOptions).length > 0) {\n options.fetchOptions = fetchOptions;\n }\n // bind(イベントあり/なし: 非イベントは data-fetch-bind)\n const bindAttr = event\n ? Procedure.attrName(event, 'bind')\n : Procedure.attrName(null, 'bind', true);\n if (fragment.hasAttribute(bindAttr)) {\n const bindSelector = fragment.getRawAttribute(bindAttr) as string | null;\n if (bindSelector) {\n const bindElements = document.body.querySelectorAll(bindSelector);\n if (bindElements.length > 0) {\n options.bindFragments = [];\n bindElements.forEach(element => {\n const fragment = Fragment.get(element);\n if (fragment) {\n options.bindFragments!.push(fragment as ElementFragment);\n }\n });\n } else {\n Log.error(\n 'Haori',\n `Bind element not found: ${bindSelector} (${bindAttr})`,\n );\n }\n }\n }\n const bindArgAttrEvent = Procedure.attrName(event, 'bind-arg');\n const bindArgAttrNonEventLegacy = Procedure.attrName(\n null,\n 'arg',\n true,\n ); // data-fetch-arg\n const bindArgAttrNonEventNew = Procedure.attrName(\n null,\n 'bind-arg',\n true,\n ); // data-fetch-bind-arg (less common)\n if (event) {\n if (fragment.hasAttribute(bindArgAttrEvent)) {\n options.bindArg = fragment.getRawAttribute(bindArgAttrEvent) as\n | string\n | null;\n }\n } else {\n // Prefer legacy `data-fetch-arg` for non-event usage.\n // Fallback to `data-fetch-bind-arg` if legacy is not present.\n if (fragment.hasAttribute(bindArgAttrNonEventLegacy)) {\n options.bindArg = fragment.getRawAttribute(\n bindArgAttrNonEventLegacy,\n ) as string | null;\n } else if (fragment.hasAttribute(bindArgAttrNonEventNew)) {\n options.bindArg = fragment.getRawAttribute(bindArgAttrNonEventNew) as\n | string\n | null;\n }\n }\n const bindParamsAttr = event\n ? Procedure.attrName(event, 'bind-params')\n : Procedure.attrName(null, 'bind-params', true);\n if (fragment.hasAttribute(bindParamsAttr)) {\n const paramsString = fragment.getRawAttribute(bindParamsAttr) as string;\n options.bindParams = paramsString.split('&').map(p => p.trim());\n }\n const bindAppendAttr = event\n ? Procedure.attrName(event, 'bind-append')\n : Procedure.attrName(null, 'bind-append', true);\n if (fragment.hasAttribute(bindAppendAttr)) {\n const paramsString = fragment.getRawAttribute(bindAppendAttr) as string;\n options.bindAppendParams = paramsString\n .split('&')\n .map(p => p.trim())\n .filter(Boolean);\n }\n const copyParamsAttr = event\n ? Procedure.attrName(event, 'copy-params')\n : null;\n if (copyParamsAttr && fragment.hasAttribute(copyParamsAttr)) {\n const paramsString = fragment.getRawAttribute(copyParamsAttr) as string;\n options.copyParams = paramsString\n .split('&')\n .map(param => param.trim())\n .filter(Boolean);\n }\n if (event) {\n if (fragment.hasAttribute(Procedure.attrName(event, 'adjust'))) {\n const adjustSelector = fragment.getRawAttribute(\n Procedure.attrName(event, 'adjust'),\n ) as string | null;\n if (adjustSelector) {\n const adjustElements = document.body.querySelectorAll(adjustSelector);\n if (adjustElements.length > 0) {\n options.adjustFragments = [];\n adjustElements.forEach(element => {\n const fragment = Fragment.get(element);\n if (fragment) {\n options.adjustFragments!.push(fragment as ElementFragment);\n }\n });\n } else {\n Log.error(\n 'Haori',\n `Adjust element not found: ${adjustSelector}` +\n ` (${Procedure.attrName(event, 'adjust')})`,\n );\n }\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'adjust-value'))) {\n const valueString = fragment.getRawAttribute(\n Procedure.attrName(event, 'adjust-value'),\n ) as string;\n const value = Number(valueString);\n if (!isNaN(value)) {\n options.adjustValue = value;\n }\n }\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'row-add'))) {\n options.rowAdd = true;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'row-remove'))) {\n options.rowRemove = true;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'row-prev'))) {\n options.rowMovePrev = true;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'row-next'))) {\n options.rowMoveNext = true;\n }\n if (fragment.hasAttribute(`${Env.prefix}${event}-after-run`)) {\n const body = fragment.getRawAttribute(\n `${Env.prefix}${event}-after-run`,\n ) as string;\n try {\n options.afterCallback = new Function(\n 'response',\n `\n\"use strict\";\n${body}\n`,\n ) as (\n response: Response | Record<string, unknown>,\n ) => AfterCallbackResult | boolean | void;\n } catch (e) {\n Log.error('Haori', `Invalid after script: ${e}`);\n }\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'dialog'))) {\n options.dialogMessage = (\n fragment.getAttribute(Procedure.attrName(event, 'dialog')) as string\n ).replace(/\\\\n/g, '\\n');\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'toast'))) {\n options.toastMessage = fragment.getAttribute(\n Procedure.attrName(event, 'toast'),\n ) as string;\n const rawLevel = fragment.getRawAttribute(\n Procedure.attrName(event, 'toast-level'),\n );\n const validLevels = ['info', 'warning', 'error', 'success'] as const;\n type ToastLevel = (typeof validLevels)[number];\n const isValidLevel = validLevels.includes(rawLevel as ToastLevel);\n options.toastLevel = isValidLevel ? (rawLevel as ToastLevel) : null;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'redirect'))) {\n options.redirectUrl = fragment.getAttribute(\n Procedure.attrName(event, 'redirect'),\n ) as string;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'scroll-error'))) {\n options.scrollOnError = true;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'scroll'))) {\n options.scrollTarget = fragment.getAttribute(\n Procedure.attrName(event, 'scroll'),\n ) as string;\n }\n // history(data-{event}-history / history-data / history-form)\n if (fragment.hasAttribute(Procedure.attrName(event, 'history'))) {\n options.historyUrl = fragment.getAttribute(\n Procedure.attrName(event, 'history'),\n ) as string | null;\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'history-data'))) {\n options.historyDataAttrName = Procedure.attrName(event, 'history-data');\n }\n if (fragment.hasAttribute(Procedure.attrName(event, 'history-form'))) {\n const historyFormSelector = fragment.getRawAttribute(\n Procedure.attrName(event, 'history-form'),\n ) as string | null;\n if (historyFormSelector) {\n const historyFormElement =\n document.body.querySelector(historyFormSelector);\n if (historyFormElement !== null) {\n options.historyFormFragment = Form.getFormFragment(\n Fragment.get(historyFormElement) as ElementFragment,\n );\n } else {\n Log.error(\n 'Haori',\n `Form element not found: ${historyFormSelector}` +\n ` (${Procedure.attrName(event, 'history-form')})`,\n );\n }\n } else {\n options.historyFormFragment = Form.getFormFragment(fragment);\n }\n }\n\n // reset/refetch/click/open/close(イベント、CSSセレクタ)\n const selectorAttrs = [\n 'reset-before',\n 'reset',\n 'refetch',\n 'click',\n 'copy',\n 'open',\n 'close',\n ] as const;\n selectorAttrs.forEach(attrKey => {\n const attrName = Procedure.attrName(event, attrKey);\n if (!fragment.hasAttribute(attrName)) {\n return;\n }\n const selector = fragment.getRawAttribute(attrName) as string | null;\n const list: ElementFragment[] = [];\n if (selector) {\n const elements = document.body.querySelectorAll(selector);\n elements.forEach(el => {\n const frag = Fragment.get(el);\n if (frag) {\n list.push(frag as ElementFragment);\n }\n });\n if (list.length === 0) {\n Log.error('Haori', `Element not found: ${selector} (${attrName})`);\n }\n } else {\n // 値が省略されている場合は自要素を対象\n list.push(fragment);\n }\n if (list.length > 0) {\n switch (attrKey) {\n case 'reset-before':\n options.resetBeforeFragments = list;\n break;\n case 'reset':\n options.resetFragments = list;\n break;\n case 'refetch':\n options.refetchFragments = list;\n break;\n case 'click':\n options.clickFragments = list;\n break;\n case 'copy':\n options.copyFragments = list;\n break;\n case 'open':\n options.openFragments = list;\n break;\n case 'close':\n options.closeFragments = list;\n break;\n }\n }\n });\n\n // copy-source(単一セレクタ)\n const copySourceAttrName = Procedure.attrName(event, 'copy-source');\n if (fragment.hasAttribute(copySourceAttrName)) {\n const selector = fragment.getRawAttribute(\n copySourceAttrName,\n ) as string | null;\n if (selector) {\n const el = document.body.querySelector(selector);\n if (el !== null) {\n const frag = Fragment.get(el);\n if (frag) {\n options.copySourceFragment = frag as ElementFragment;\n } else {\n Log.error(\n 'Haori',\n `Element is not managed by Haori: ${selector}` +\n ` (${copySourceAttrName})`,\n );\n }\n } else {\n Log.error(\n 'Haori',\n `Element not found: ${selector} (${copySourceAttrName})`,\n );\n }\n } else {\n // 値が省略されている場合は自要素を対象\n options.copySourceFragment = fragment;\n }\n }\n }\n\n // 非イベントの data / form(data-fetch-data / data-fetch-form)も取り込む\n if (!event) {\n if (fragment.hasAttribute(Procedure.attrName(null, 'data', true))) {\n options.dataAttrName = Procedure.attrName(null, 'data', true);\n }\n if (fragment.hasAttribute(Procedure.attrName(null, 'form', true))) {\n const formSelector = fragment.getRawAttribute(\n Procedure.attrName(null, 'form', true),\n ) as string | null;\n if (formSelector) {\n const formElement = document.body.querySelector(formSelector);\n if (formElement !== null) {\n options.formFragment = Form.getFormFragment(\n Fragment.get(formElement) as ElementFragment,\n );\n } else {\n Log.error(\n 'Haori',\n `Form element not found: ${formSelector} (` +\n `${Procedure.attrName(null, 'fetch-form', true)})`,\n );\n }\n } else {\n // 属性はあるが値が省略された場合は自要素もしくは先祖の form を対象\n options.formFragment = Form.getFormFragment(fragment);\n }\n }\n }\n\n // fetch が指定されているのにバインド先が無い場合、デフォルトで自要素にバインド\n if (\n hasFetchAttr &&\n (!options.bindFragments || options.bindFragments.length === 0)\n ) {\n options.bindFragments = [fragment];\n }\n return options;\n }\n\n /**\n * ElementFragment の構造的タイプガード。\n *\n * @param value チェックする値\n * @returns ElementFragment である場合は true、それ以外は false\n */\n private static isElementFragment(value: unknown): value is ElementFragment {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.getTarget === 'function' &&\n typeof obj.getChildElementFragments === 'function'\n );\n }\n\n /** オプション */\n private readonly options: ProcedureOptions;\n\n /** reset-before 後に確定した historyData スナップショット */\n private historyDataSnapshot: Record<string, unknown> | null | undefined;\n\n /** reset-before 後に確定した historyForm スナップショット */\n private historyFormSnapshot: Record<string, unknown> | null | undefined;\n\n /**\n * オプションを指定してProcedureクラスのインスタンスを生成します。\n *\n * @param options オプション\n */\n constructor(options: ProcedureOptions);\n\n /**\n * フラグメントの属性からオプションを生成してProcedureクラスのインスタンスを生成します。\n *\n * @param fragment フラグメント\n * @param event イベント名\n */\n constructor(fragment: ElementFragment, event: string | null);\n\n /**\n * コンストラクタ。\n *\n * @param arg1 オプションもしくはフラグメント\n * @param arg2 イベント名\n */\n constructor(\n arg1: ProcedureOptions | ElementFragment,\n arg2: string | null = null,\n ) {\n if (Procedure.isElementFragment(arg1)) {\n this.options = Procedure.buildOptions(arg1, arg2);\n this.eventType = arg2;\n } else {\n this.options = arg1;\n this.eventType = null;\n }\n }\n\n /**\n * 非イベント data-fetch の自動再評価用シグネチャを解決します。\n *\n * @param fragment 対象フラグメント\n * @returns フェッチシグネチャと未解決参照の有無\n */\n public static resolveAutoFetchSignature(\n fragment: ElementFragment,\n ): ResolvedFetchSignature {\n return new Procedure(fragment, null).resolveFetchSignature();\n }\n\n /**\n * 一連の処理を実行します。オプションが空の場合は即座にresolveされます。\n *\n * @returns 実行結果のPromise\n */\n run(): Promise<void> {\n return this.runWithResult().then(() => undefined);\n }\n\n /**\n * 一連の処理を実行し、成功したかどうかを返します。\n *\n * @returns 成功した場合は true、途中停止や失敗時は false\n */\n runWithResult(): Promise<boolean> {\n return this.execute();\n }\n\n /**\n * 一連の処理を実行します。成功結果を内部で扱うための実体です。\n *\n * @returns 実行成功時は true、停止や失敗時は false\n */\n private async execute(): Promise<boolean> {\n const executionLock = this.acquireExecutionLock();\n if (executionLock === false) {\n return false;\n }\n\n try {\n if (Object.keys(this.options).length === 0) {\n return false;\n }\n if (\n this.options.formFragment &&\n this.validate(this.options.formFragment) === false\n ) {\n return false;\n }\n const confirmed = await this.confirm();\n if (!confirmed) {\n return false;\n }\n if (\n this.options.resetBeforeFragments &&\n this.options.resetBeforeFragments.length > 0\n ) {\n await Promise.all(\n this.options.resetBeforeFragments.map(fragment =>\n Form.reset(fragment),\n ),\n );\n this.captureHistorySnapshots();\n }\n const preparedRequest = this.prepareFetchRequest();\n const payload = preparedRequest.payload;\n let fetchUrl = preparedRequest.url;\n let fetchOptions = preparedRequest.options;\n if (this.options.beforeCallback) {\n const result = this.options.beforeCallback(\n fetchUrl || null,\n fetchOptions || null,\n );\n if (result !== undefined && result !== null) {\n if (result === false || (typeof result === 'object' && result.stop)) {\n return false;\n }\n if (typeof result === 'object') {\n fetchUrl = ('fetchUrl' in result ? result.fetchUrl : fetchUrl) as\n | string\n | null;\n fetchOptions = (\n 'fetchOptions' in result ? result.fetchOptions : fetchOptions\n ) as RequestInit | null;\n }\n }\n }\n\n const hasPayload = Object.keys(payload).length > 0;\n if (fetchUrl) {\n const finalOptions: RequestInit = {...(fetchOptions || {})};\n const requestedMethod = preparedRequest.requestedMethod;\n const method = preparedRequest.effectiveMethod;\n const isDemoQueryNormalization =\n preparedRequest.transportMode === 'query-get';\n const queryString = preparedRequest.queryString;\n\n if (isDemoQueryNormalization) {\n Log.info('Haori demo fetch normalization', {\n runtime: Env.runtime,\n requestedMethod,\n effectiveMethod: method,\n transportMode: 'query-get',\n url: fetchUrl,\n payload: hasPayload ? payload : undefined,\n queryString,\n });\n }\n\n // fetchstartイベントを発火\n if (this.options.targetFragment && fetchUrl) {\n const startedAt = performance.now();\n const fetchStartMetadata = {\n runtime: Env.runtime,\n requestedMethod,\n effectiveMethod: method,\n transportMode: isDemoQueryNormalization ? 'query-get' : 'http',\n ...(isDemoQueryNormalization ? {queryString} : {}),\n };\n\n HaoriEvent.fetchStart(\n this.options.targetFragment.getTarget(),\n fetchUrl,\n finalOptions,\n hasPayload ? payload : undefined,\n fetchStartMetadata,\n );\n\n return fetch(fetchUrl, finalOptions)\n .then(response => {\n return this.handleFetchResult(\n response,\n fetchUrl || undefined,\n startedAt,\n );\n })\n .catch(error => {\n if (fetchUrl) {\n HaoriEvent.fetchError(\n this.options.targetFragment!.getTarget(),\n fetchUrl,\n error,\n );\n }\n throw error;\n });\n }\n return fetch(fetchUrl, finalOptions).then(response => {\n return this.handleFetchResult(response, fetchUrl || undefined);\n });\n }\n\n // fetchUrlが無い場合(changeイベント等)、bindFragmentsが無ければformFragmentにバインド\n if (\n (!this.options.bindFragments ||\n this.options.bindFragments.length === 0) &&\n this.options.formFragment &&\n hasPayload\n ) {\n // 双方向バインディング: フォーム値を自動的にバインディングデータに反映\n const formFragment = this.options.formFragment;\n const formElement = formFragment.getTarget();\n const skipFragments = new Set<ElementFragment>();\n if (\n executionLock &&\n executionLock.appliedDisabledAttribute &&\n this.options.targetFragment\n ) {\n skipFragments.add(this.options.targetFragment);\n }\n\n formElement.setAttribute(`${Env.prefix}bind`, JSON.stringify(payload));\n\n const bindingData = formFragment.getBindingData();\n Object.assign(bindingData, payload);\n await Core.setBindingData(formElement, bindingData, skipFragments);\n }\n\n const merged = hasPayload ? payload : {};\n const response = new Response(JSON.stringify(merged), {\n headers: {'Content-Type': 'application/json'},\n });\n return this.handleFetchResult(response);\n } finally {\n this.releaseExecutionLock(executionLock);\n }\n }\n\n /**\n * click 手続きの重複実行を防ぐためのロックを取得します。\n *\n * @returns ロック情報。取得不要なら null、取得失敗なら false。\n */\n private acquireExecutionLock(): ExecutionLockState | null | false {\n if (this.eventType !== 'click' || !this.options.targetFragment) {\n return null;\n }\n\n const targetFragment = this.options.targetFragment;\n const target = targetFragment.getTarget();\n if (\n Procedure.RUNNING_CLICK_TARGETS.has(target) ||\n target.matches(':disabled') ||\n target.hasAttribute('disabled') ||\n target.hasAttribute(PROCEDURE_CLICK_LOCK_MARKER)\n ) {\n return false;\n }\n\n Procedure.RUNNING_CLICK_TARGETS.add(target);\n target.setAttribute(PROCEDURE_CLICK_LOCK_MARKER, '');\n target.setAttribute('disabled', '');\n return {\n target,\n appliedDisabledAttribute: true,\n };\n }\n\n /**\n * 取得済みの実行ロックを解放します。\n *\n * @param executionLock 解放対象のロック情報。\n * @returns 戻り値はありません。\n */\n private releaseExecutionLock(\n executionLock: ExecutionLockState | null | false,\n ): void {\n if (!executionLock) {\n return;\n }\n\n Procedure.RUNNING_CLICK_TARGETS.delete(executionLock.target);\n if (executionLock.appliedDisabledAttribute) {\n executionLock.target.removeAttribute('disabled');\n executionLock.target.removeAttribute(PROCEDURE_CLICK_LOCK_MARKER);\n }\n }\n\n /**\n * フェッチ後の処理を実行します。\n */\n private async handleFetchResult(\n response: Response,\n url?: string,\n startedAt?: number,\n ): Promise<boolean> {\n const activeHaori = resolveProcedureHaoriApi();\n // エラー応答時は以後の処理を停止し、メッセージを伝播\n if (!response.ok) {\n if (this.options.targetFragment && url) {\n HaoriEvent.fetchError(\n this.options.targetFragment.getTarget(),\n url,\n new Error(`${response.status} ${response.statusText}`),\n response.status,\n startedAt,\n );\n }\n await this.handleFetchError(response);\n return false;\n }\n\n // fetchendイベントを発火\n if (this.options.targetFragment && url && startedAt) {\n HaoriEvent.fetchEnd(\n this.options.targetFragment.getTarget(),\n url,\n response.status,\n startedAt,\n );\n }\n\n if (this.options.afterCallback) {\n const result = this.options.afterCallback(response);\n if (result !== undefined && result !== null) {\n if (result === false || (typeof result === 'object' && result.stop)) {\n return false;\n }\n if (typeof result === 'object' && 'response' in result) {\n response = (\n 'response' in result ? result.response : response\n ) as Response;\n }\n }\n }\n const promises: Promise<unknown>[] = [];\n promises.push(this.bindResult(response));\n promises.push(this.adjust());\n promises.push(this.addRow());\n promises.push(this.removeRow());\n promises.push(this.movePrevRow());\n promises.push(this.moveNextRow());\n await Promise.all(promises);\n\n if (this.options.resetFragments && this.options.resetFragments.length > 0) {\n await Promise.all(\n this.options.resetFragments.map(fragment => Form.reset(fragment)),\n );\n }\n\n await this.copy();\n\n const deferredPromises: Promise<unknown>[] = [];\n if (\n this.options.refetchFragments &&\n this.options.refetchFragments.length > 0\n ) {\n this.options.refetchFragments.forEach(fragment => {\n deferredPromises.push(new Procedure(fragment, null).run());\n });\n }\n if (this.options.clickFragments && this.options.clickFragments.length > 0) {\n // bind 後の最新 DOM を参照させるため click 前に再評価する。\n // 複数フラグメントは直列実行:各 click が前の evaluateAll 完了後に発火する。\n for (const fragment of this.options.clickFragments) {\n await Core.evaluateAll(fragment);\n const target = fragment.getTarget();\n if (typeof target.click === 'function') {\n target.click();\n } else {\n target.dispatchEvent(\n new MouseEvent('click', {bubbles: true, cancelable: true}),\n );\n }\n }\n }\n if (this.options.openFragments && this.options.openFragments.length > 0) {\n this.options.openFragments.forEach(fragment => {\n const target = fragment.getTarget();\n if (target instanceof HTMLElement) {\n deferredPromises.push(activeHaori.openDialog(target));\n } else {\n Log.error('Haori', 'Element is not an HTML element: ', target);\n }\n });\n }\n if (this.options.closeFragments && this.options.closeFragments.length > 0) {\n this.options.closeFragments.forEach(fragment => {\n const target = fragment.getTarget();\n if (target instanceof HTMLElement) {\n deferredPromises.push(activeHaori.closeDialog(target));\n } else {\n Log.error('Haori', 'Element is not an HTML element: ', target);\n }\n });\n }\n // 仕様順序: 先に各種操作(bind/adjust/row/reset/refetch/click/open/close)を完了\n await Promise.all(deferredPromises);\n // その後にダイアログ/トーストを表示\n if (this.options.dialogMessage) {\n await activeHaori.dialog(this.options.dialogMessage);\n }\n if (this.options.toastMessage) {\n await activeHaori.toast(\n this.options.toastMessage,\n this.options.toastLevel ?? 'info',\n );\n }\n this.pushHistory();\n if (this.options.scrollTarget) {\n const el = document.querySelector<HTMLElement>(this.options.scrollTarget);\n el?.scrollIntoView({behavior: 'smooth', block: 'nearest'});\n }\n if (this.options.redirectUrl) {\n window.location.href = this.options.redirectUrl;\n }\n return true;\n }\n\n /**\n * history.pushState を実行します。\n *\n * `historyUrl` / `historyData` / `historyFormFragment` の内容を基に URL を組み立て、\n * `history.pushState()` を呼び出します。いずれも未指定の場合は何もしません。\n * 不正 URL・オリジン違反・例外は `Log.error` でログ出力してスキップし、後続処理は継続します。\n */\n private pushHistory(): void {\n const hasHistoryUrl =\n this.options.historyUrl !== undefined && this.options.historyUrl !== null;\n const historyDataValues = this.resolveHistoryDataValues();\n const historyFormValues = this.resolveHistoryFormValues();\n const hasHistoryData =\n historyDataValues !== undefined && historyDataValues !== null;\n const hasHistoryForm =\n historyFormValues !== undefined && historyFormValues !== null;\n\n if (!hasHistoryUrl && !hasHistoryData && !hasHistoryForm) {\n return;\n }\n\n try {\n const baseUrlString = hasHistoryUrl\n ? (this.options.historyUrl as string)\n : window.location.pathname;\n const url = new URL(baseUrlString, window.location.href);\n\n if (url.origin !== window.location.origin) {\n const errorMessage =\n 'history.pushState: cross-origin URL is not allowed: ' +\n url.toString();\n Log.error('Haori', errorMessage);\n return;\n }\n\n const appendParams = (values: Record<string, unknown>): void => {\n for (const [k, v] of Object.entries(values)) {\n if (v === undefined || v === null) {\n continue;\n }\n if (Array.isArray(v)) {\n v.forEach(item => url.searchParams.append(k, String(item)));\n } else if (typeof v === 'object') {\n url.searchParams.set(k, JSON.stringify(v));\n } else {\n url.searchParams.set(k, String(v));\n }\n }\n };\n\n if (hasHistoryData) {\n appendParams(historyDataValues as Record<string, unknown>);\n }\n if (hasHistoryForm) {\n appendParams(historyFormValues as Record<string, unknown>);\n }\n\n history.pushState(\n {[PROCEDURE_HISTORY_STATE_KEY]: true},\n '',\n url.toString(),\n );\n } catch (e) {\n Log.error('Haori', `history.pushState failed: ${e}`);\n }\n }\n\n /**\n * フェッチエラー応答のメッセージを適切な要素へ伝播します。\n */\n private async handleFetchError(response: Response): Promise<boolean> {\n // ベースとなるフォーム/フラグメントを決定\n let baseFragment: ElementFragment | null = null;\n if (this.options.formFragment) {\n baseFragment = this.options.formFragment;\n } else if (this.options.targetFragment) {\n baseFragment =\n Form.getFormFragment(this.options.targetFragment) ||\n this.options.targetFragment;\n }\n\n const addGeneralMessage = async (message: string) => {\n const targetEl = baseFragment ? baseFragment.getTarget() : document.body;\n await resolveProcedureHaoriApi().addErrorMessage(targetEl, message);\n };\n\n const scrollToFirstError = () => {\n if (!this.options.scrollOnError) {\n return;\n }\n const root = baseFragment ? baseFragment.getTarget() : document.body;\n // addErrorMessage はフォーム以外の target に対して parentElement へエラーを付与するため、\n // root 自身・parentElement・root 配下の順で探索する\n const errorTarget =\n root.getAttribute('data-message-level') === 'error'\n ? root\n : root.parentElement?.getAttribute('data-message-level') === 'error'\n ? root.parentElement\n : root.querySelector<HTMLElement>('[data-message-level=\"error\"]');\n errorTarget?.scrollIntoView({behavior: 'smooth', block: 'nearest'});\n };\n\n // コンテンツタイプに応じて解析\n const contentType = response.headers.get('Content-Type') || '';\n if (contentType.includes('application/json')) {\n try {\n const data = await response.json();\n // 代表的な形式に対応\n const entries: Array<{key?: string; message: string}> = [];\n if (data && typeof data === 'object') {\n if (typeof data.message === 'string') {\n entries.push({message: data.message});\n }\n if (Array.isArray(data.messages)) {\n for (const m of data.messages) {\n if (typeof m === 'string') {\n entries.push({message: m});\n }\n }\n }\n if (data.errors && typeof data.errors === 'object') {\n for (const [k, v] of Object.entries(data.errors)) {\n if (Array.isArray(v)) {\n entries.push({key: k, message: v.join('\\n')});\n } else if (typeof v === 'string') {\n entries.push({key: k, message: v});\n } else if (v != null) {\n entries.push({key: k, message: String(v)});\n }\n }\n }\n // キー: 値(文字列/配列)形式にフォールバック\n if (entries.length === 0) {\n for (const [k, v] of Object.entries(data)) {\n if (k === 'message' || k === 'messages' || k === 'errors') {\n continue;\n }\n if (Array.isArray(v)) {\n entries.push({key: k, message: v.join('\\n')});\n } else if (typeof v === 'string') {\n entries.push({key: k, message: v});\n }\n }\n }\n }\n if (entries.length === 0) {\n // 汎用メッセージ\n await addGeneralMessage(`${response.status} ${response.statusText}`);\n scrollToFirstError();\n return false;\n }\n // メッセージを反映\n for (const e of entries) {\n if (e.key && baseFragment) {\n await Form.addErrorMessage(baseFragment, e.key, e.message);\n } else {\n await addGeneralMessage(e.message);\n }\n }\n scrollToFirstError();\n return false;\n } catch {\n // JSON 解析失敗時はテキストにフォールバック\n }\n }\n // テキストとして処理\n try {\n const text = await response.text();\n if (text && text.trim().length > 0) {\n await addGeneralMessage(text.trim());\n } else {\n await addGeneralMessage(`${response.status} ${response.statusText}`);\n }\n } catch {\n await addGeneralMessage(`${response.status} ${response.statusText}`);\n }\n scrollToFirstError();\n return false;\n }\n\n /**\n * 対象のフラグメント以下の入力要素に対してバリデーションを実行します。\n * バリデーションエラーがある場合は、最初のエラー要素にフォーカスを移動します。\n *\n * @param fragment 対象のフラグメント\n * @returns バリデーション結果(true: 成功, false: 失敗)\n */\n validate(fragment: ElementFragment): boolean {\n if (this.options.valid !== true) {\n return true;\n }\n const firstInvalid = this.findFirstInvalid(fragment);\n if (firstInvalid === null) {\n return true;\n }\n // 検出フェーズ(findFirstInvalid)は checkValidity で副作用なく走査済み。\n // reportValidity と focus は確定した 1 要素にだけ呼び出す。\n (\n firstInvalid as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n ).reportValidity();\n firstInvalid.focus();\n if (this.options.scrollOnError) {\n firstInvalid.scrollIntoView({behavior: 'smooth', block: 'nearest'});\n }\n return false;\n }\n\n /**\n * 対象フラグメント以下で DOM 順の最上部にある invalid 要素を返します。\n * 副作用のない checkValidity のみを使用し、検出のみを行います。\n *\n * @param fragment 対象のフラグメント\n * @returns 最初の invalid 要素、なければ null\n */\n private findFirstInvalid(fragment: ElementFragment): HTMLElement | null {\n // 子要素を逆順に処理することで、DOM 順の先頭要素が最後に found を上書きし、\n // 最終的に最上部の invalid 要素が返る\n let found: HTMLElement | null = null;\n for (const child of fragment.getChildElementFragments().reverse()) {\n const result = this.findFirstInvalid(child);\n if (result !== null) {\n found = result;\n }\n }\n // 自身は子より DOM 上位にあるため、invalid なら子の結果を上書きする\n if (!this.checkOne(fragment)) {\n return fragment.getTarget();\n }\n return found;\n }\n\n /**\n * 対象のフラグメントに対して、副作用なく有効性を検査します。\n * reportValidity は使わず checkValidity のみ呼び出します。\n *\n * @param fragment 対象のフラグメント\n * @returns 有効なら true、無効なら false\n */\n private checkOne(fragment: ElementFragment): boolean {\n const target = fragment.getTarget();\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLSelectElement ||\n target instanceof HTMLTextAreaElement\n ) {\n return target.checkValidity();\n }\n return true;\n }\n\n /**\n * 確認メッセージを表示し、ユーザーの確認を求めます。\n * メッセージが設定されていない場合は、即座に成功とみなします。\n *\n * @returns ユーザーの確認結果を含むPromise(true: 確認, false: キャンセル)\n */\n private confirm(): Promise<boolean> {\n const message = this.options.confirmMessage;\n if (message === null || message === undefined) {\n return Promise.resolve(true);\n }\n return resolveProcedureHaoriApi().confirm(message);\n }\n\n /**\n * 結果データを対象のフラグメントにバインドします。\n *\n * @param response フェッチのレスポンスオブジェクト\n */\n private bindResult(response: Response): Promise<void> {\n if (\n !this.options.bindFragments ||\n this.options.bindFragments.length === 0\n ) {\n return Promise.resolve();\n }\n const promise = response.headers\n .get('Content-Type')\n ?.includes('application/json')\n ? response.json()\n : response.text();\n return promise.then(data => {\n if (this.options.bindParams) {\n const newData = {} as Record<string, unknown>;\n this.options.bindParams.forEach(param => {\n if (data && typeof data === 'object' && param in data) {\n newData[param] = data[param];\n }\n });\n data = newData;\n }\n const promises: Promise<unknown>[] = [];\n if (this.options.bindArg) {\n this.options.bindFragments!.forEach(fragment => {\n const bindingData = fragment.getBindingData();\n const bindArg = this.options.bindArg as string;\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const currentValue = bindingData[bindArg];\n const currentObject =\n currentValue &&\n typeof currentValue === 'object' &&\n !Array.isArray(currentValue)\n ? (currentValue as Record<string, unknown>)\n : {};\n bindingData[bindArg] = this.mergeAppendBindingData(\n fragment,\n data as Record<string, unknown>,\n currentObject,\n );\n } else {\n bindingData[bindArg] = data;\n }\n promises.push(Core.setBindingData(fragment.getTarget(), bindingData));\n });\n } else if (typeof data === 'string') {\n Log.error('Haori', 'string data cannot be bound without a bindArg.');\n return Promise.reject(\n new Error('string data cannot be bound without a bindArg.'),\n );\n } else {\n this.options.bindFragments!.forEach(fragment => {\n const resolvedData = this.mergeAppendBindingData(\n fragment,\n data as Record<string, unknown>,\n );\n promises.push(\n Core.setBindingData(fragment.getTarget(), resolvedData),\n );\n });\n }\n return Promise.all(promises).then(() => undefined);\n });\n }\n\n /**\n * bind-append 指定があるキーについて、既存配列と結合したデータを返します。\n */\n private mergeAppendBindingData(\n fragment: ElementFragment,\n data: Record<string, unknown>,\n currentData: Record<string, unknown> = fragment.getBindingData(),\n ): Record<string, unknown> {\n if (\n !this.options.bindAppendParams ||\n this.options.bindAppendParams.length === 0\n ) {\n return data;\n }\n\n const merged = {...data};\n const current = currentData;\n for (const key of this.options.bindAppendParams) {\n const incoming = merged[key];\n const existing = current[key];\n if (Array.isArray(existing) && Array.isArray(incoming)) {\n merged[key] = existing.concat(incoming);\n }\n }\n return merged;\n }\n\n /**\n * 指定されたフラグメントへバインディングデータをコピーします。\n */\n private copy(): Promise<void> {\n if (\n !this.options.copyFragments ||\n this.options.copyFragments.length === 0\n ) {\n return Promise.resolve();\n }\n\n const sourceData = this.resolveCopySourceData();\n const copyData = this.pickCopyData(sourceData);\n const promises = this.options.copyFragments.map(fragment => {\n const bindingData = {\n ...fragment.getBindingData(),\n ...copyData,\n };\n return Core.setBindingData(fragment.getTarget(), bindingData);\n });\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * copy のコピー元データを取得します。\n */\n private resolveCopySourceData(): Record<string, unknown> {\n if (this.options.copySourceFragment) {\n const sourceTarget = this.options.copySourceFragment.getTarget();\n if (sourceTarget.tagName === 'FORM') {\n return Form.getValues(this.options.copySourceFragment);\n }\n return {...this.options.copySourceFragment.getBindingData()};\n }\n if (this.options.formFragment) {\n return Form.getValues(this.options.formFragment);\n }\n if (this.options.targetFragment) {\n return {...this.options.targetFragment.getBindingData()};\n }\n return {};\n }\n\n /**\n * data 属性とフォーム値を統合した送信データを作成します。\n *\n * @returns 送信データ。\n */\n private buildPayload(): Record<string, unknown> {\n return this.buildPayloadResolution().payload;\n }\n\n /**\n * data 属性とフォーム値を統合した送信データを作成し、未解決参照の有無を返します。\n *\n * @returns 送信データと未解決参照の有無。\n */\n private buildPayloadResolution(): PayloadResolution {\n const payload: Record<string, unknown> = {};\n let hasUnresolvedReference = false;\n if (this.options.formFragment) {\n Object.assign(payload, Form.getValues(this.options.formFragment));\n }\n if (this.options.data && typeof this.options.data === 'object') {\n Object.assign(payload, this.options.data);\n }\n if (this.options.targetFragment && this.options.dataAttrName) {\n const resolvedData = Procedure.resolveDataAttributeDetailed(\n this.options.targetFragment,\n this.options.dataAttrName,\n );\n hasUnresolvedReference =\n hasUnresolvedReference || resolvedData.hasUnresolvedReference;\n if (resolvedData.value) {\n Object.assign(payload, resolvedData.value);\n }\n }\n return {payload, hasUnresolvedReference};\n }\n\n /**\n * 現在の data-fetch 実行内容を比較用シグネチャへ正規化します。\n *\n * @returns フェッチシグネチャと未解決参照の有無。\n */\n private resolveFetchSignature(): ResolvedFetchSignature {\n const preparedRequest = this.prepareFetchRequest();\n return {\n signature: preparedRequest.signature,\n hasUnresolvedReference: preparedRequest.hasUnresolvedReference,\n };\n }\n\n /**\n * 現在のオプションから送信前の fetch リクエストを組み立てます。\n *\n * @returns リクエスト情報。\n */\n private prepareFetchRequest(): PreparedFetchRequest {\n const payloadResolution = this.buildPayloadResolution();\n const payload = payloadResolution.payload;\n const hasUnresolvedReference =\n Boolean(this.options.fetchHasUnresolvedReference) ||\n payloadResolution.hasUnresolvedReference;\n\n if (!this.options.fetchUrl || hasUnresolvedReference) {\n return {\n url: null,\n options: null,\n payload,\n hasUnresolvedReference,\n requestedMethod: 'GET',\n effectiveMethod: 'GET',\n transportMode: 'http',\n signature: null,\n };\n }\n\n let fetchUrl = this.options.fetchUrl;\n const finalOptions: RequestInit = {...(this.options.fetchOptions || {})};\n const headers = new Headers(\n (finalOptions.headers as HeadersInit | undefined) || undefined,\n );\n const requestedMethod = (finalOptions.method || 'GET').toUpperCase();\n const isDemoQueryNormalization =\n Env.runtime === 'demo' && !isQueryTransportMethod(requestedMethod);\n const method = isDemoQueryNormalization ? 'GET' : requestedMethod;\n\n finalOptions.method = method;\n\n if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') {\n if (Object.keys(payload).length > 0) {\n fetchUrl = appendPayloadToUrl(fetchUrl, payload);\n }\n } else if (Object.keys(payload).length > 0) {\n const contentType = headers.get('Content-Type') || '';\n if (/multipart\\/form-data/i.test(contentType)) {\n headers.delete('Content-Type');\n const formData = new FormData();\n for (const [k, v] of Object.entries(payload)) {\n if (v === undefined || v === null) {\n formData.append(k, '');\n } else if (v instanceof Blob) {\n formData.append(k, v);\n } else if (Array.isArray(v)) {\n v.forEach(item => formData.append(k, String(item)));\n } else if (typeof v === 'object') {\n formData.append(k, JSON.stringify(v));\n } else {\n formData.append(k, String(v));\n }\n }\n finalOptions.body = formData;\n } else if (/application\\/x-www-form-urlencoded/i.test(contentType)) {\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(payload)) {\n if (v === undefined) {\n continue;\n }\n if (v === null) {\n params.append(k, '');\n } else if (Array.isArray(v)) {\n v.forEach(item => params.append(k, String(item)));\n } else if (typeof v === 'object') {\n params.append(k, JSON.stringify(v));\n } else {\n params.append(k, String(v));\n }\n }\n finalOptions.body = params;\n } else {\n headers.set('Content-Type', 'application/json');\n finalOptions.body = JSON.stringify(payload);\n }\n }\n\n finalOptions.headers = headers;\n let queryString: string | undefined;\n\n if (isDemoQueryNormalization) {\n queryString = new URL(fetchUrl, window.location.href).search || undefined;\n headers.delete('Content-Type');\n }\n\n return {\n url: fetchUrl,\n options: finalOptions,\n payload,\n hasUnresolvedReference: false,\n requestedMethod,\n effectiveMethod: method,\n queryString,\n transportMode: isDemoQueryNormalization ? 'query-get' : 'http',\n signature: buildFetchSignature(fetchUrl, finalOptions),\n };\n }\n\n /**\n * reset-before 後の history 用スナップショットを保存します。\n */\n private captureHistorySnapshots(): void {\n if (this.options.targetFragment && this.options.historyDataAttrName) {\n this.historyDataSnapshot = Procedure.resolveDataAttribute(\n this.options.targetFragment,\n this.options.historyDataAttrName,\n );\n } else {\n this.historyDataSnapshot = undefined;\n }\n\n this.historyFormSnapshot = this.options.historyFormFragment\n ? Form.getValues(this.options.historyFormFragment)\n : undefined;\n }\n\n /**\n * history-data の評価値を取得します。\n *\n * @returns history-data の評価値。\n */\n private resolveHistoryDataValues():\n | Record<string, unknown>\n | null\n | undefined {\n if (this.historyDataSnapshot !== undefined) {\n return this.historyDataSnapshot;\n }\n if (this.options.targetFragment && this.options.historyDataAttrName) {\n return Procedure.resolveDataAttribute(\n this.options.targetFragment,\n this.options.historyDataAttrName,\n );\n }\n return this.options.historyData;\n }\n\n /**\n * history-form の評価値を取得します。\n *\n * @returns history-form の評価値。\n */\n private resolveHistoryFormValues():\n | Record<string, unknown>\n | null\n | undefined {\n if (this.historyFormSnapshot !== undefined) {\n return this.historyFormSnapshot;\n }\n if (this.options.historyFormFragment) {\n return Form.getValues(this.options.historyFormFragment);\n }\n return undefined;\n }\n\n /**\n * copy-params が指定されている場合は include / exclude を考慮して抽出します。\n */\n private pickCopyData(\n sourceData: Record<string, unknown>,\n ): Record<string, unknown> {\n if (!this.options.copyParams || this.options.copyParams.length === 0) {\n return sourceData;\n }\n\n const includeParams = new Set<string>();\n const excludeParams = new Set<string>();\n\n this.options.copyParams.forEach(param => {\n const trimmedParam = param.trim();\n if (!trimmedParam) {\n return;\n }\n if (trimmedParam.startsWith('!')) {\n const excludedParam = trimmedParam.slice(1).trim();\n if (excludedParam) {\n excludeParams.add(excludedParam);\n }\n return;\n }\n includeParams.add(trimmedParam);\n });\n\n const filtered: Record<string, unknown> = {};\n const sourceKeys =\n includeParams.size > 0\n ? Array.from(includeParams)\n : Object.keys(sourceData);\n\n sourceKeys.forEach(param => {\n if (!(param in sourceData)) {\n return;\n }\n if (excludeParams.has(param)) {\n return;\n }\n filtered[param] = sourceData[param];\n });\n\n return filtered;\n }\n\n /**\n * 値の増減を行います。\n */\n private adjust(): Promise<void> {\n if (\n !this.options.adjustFragments ||\n this.options.adjustFragments.length === 0\n ) {\n return Promise.resolve();\n }\n const adjustValue = this.options.adjustValue ?? 0;\n const promises: Promise<void>[] = [];\n for (const fragment of this.options.adjustFragments) {\n let valueString = fragment.getValue();\n if (\n valueString === null ||\n valueString === undefined ||\n valueString === ''\n ) {\n valueString = '0';\n }\n let value = Number(valueString);\n if (isNaN(value)) {\n value = 0;\n }\n value += adjustValue;\n promises.push(fragment.setValue(String(value)));\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * 行フラグメントを取得します。\n *\n * @returns 行フラグメントまたはnull\n */\n private getRowFragment(): ElementFragment | null {\n if (!this.options.targetFragment) {\n Log.error('Haori', 'Target fragment is not specified for row operation.');\n return null;\n }\n const rowFragment = this.options.targetFragment.closestByAttribute(\n `${Env.prefix}row`,\n );\n if (!rowFragment) {\n Log.error('Haori', 'Row fragment not found.');\n return null;\n }\n return rowFragment;\n }\n\n /**\n * 行を追加します。\n *\n * @returns 処理結果のPromise\n */\n private addRow(): Promise<void> {\n if (this.options.rowAdd !== true) {\n return Promise.resolve();\n }\n const rowFragment = this.getRowFragment();\n if (!rowFragment) {\n return Promise.reject(new Error('Row fragment not found.'));\n }\n const promises: Promise<void>[] = [];\n const newFragment = rowFragment.clone();\n promises.push(\n rowFragment.getParent()!.insertAfter(newFragment, rowFragment),\n );\n promises.push(Core.evaluateAll(newFragment));\n // 追加された行のフォーム要素をリセット\n promises.push(Form.reset(newFragment as ElementFragment));\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * 行を削除します。\n *\n * @returns 処理結果のPromise\n */\n private removeRow(): Promise<void> {\n if (this.options.rowRemove !== true) {\n return Promise.resolve();\n }\n const rowFragment = this.getRowFragment();\n if (!rowFragment) {\n return Promise.reject(new Error('Row fragment not found.'));\n }\n // 1行だった場合は削除しない\n const parent = rowFragment.getParent();\n if (parent) {\n const siblings = parent.getChildElementFragments().filter(child => {\n // data-each-before と data-each-after を除外\n return (\n !child.hasAttribute(`${Env.prefix}each-before`) &&\n !child.hasAttribute(`${Env.prefix}each-after`)\n );\n });\n if (siblings.length <= 1) {\n return Promise.resolve();\n }\n }\n return rowFragment.remove();\n }\n\n /**\n * 前の行へ移動します。\n *\n * @returns 処理結果のPromise\n */\n private movePrevRow(): Promise<void> {\n if (this.options.rowMovePrev !== true) {\n return Promise.resolve();\n }\n const rowFragment = this.getRowFragment();\n if (!rowFragment) {\n return Promise.reject(new Error('Row fragment not found.'));\n }\n const prevFragment = rowFragment.getPrevious();\n if (!prevFragment) {\n return Promise.resolve();\n }\n const parent = rowFragment.getParent();\n if (!parent) {\n return Promise.resolve();\n }\n return parent.insertBefore(rowFragment, prevFragment);\n }\n\n /**\n * 次の行へ移動します。\n *\n * @returns 処理結果のPromise\n */\n private moveNextRow(): Promise<void> {\n if (this.options.rowMoveNext !== true) {\n return Promise.resolve();\n }\n const rowFragment = this.getRowFragment();\n if (!rowFragment) {\n return Promise.reject(new Error('Row fragment not found.'));\n }\n const nextFragment = rowFragment.getNext();\n if (!nextFragment) {\n return Promise.resolve();\n }\n const parent = rowFragment.getParent();\n if (!parent) {\n return Promise.resolve();\n }\n return parent.insertAfter(rowFragment, nextFragment);\n }\n}\n","/**\n * @fileoverview URLパラメータ取得クラス\n *\n * URLのクエリパラメータを取得します。\n */\n\nexport default class Url {\n /**\n * URLのクエリパラメータを取得します。\n *\n * @returns URLのクエリパラメータのキーと値のマップ\n */\n public static readParams(): Record<string, string> {\n const params: Record<string, string> = {};\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n urlParams.forEach((value, key) => {\n params[key] = value;\n });\n return params;\n }\n}\n","/**\n * @fileoverview HTMLインポート機能\n *\n * 指定URLの HTML を取得し、body タグの中身のみを取り出します。\n * 仕様: data-import — 指定したURLの body タグの中身を対象エレメントの innerHTML に設定する。\n */\nimport Log from './log';\n\n/**\n * インポート機能を提供するクラスです。\n */\nexport class Import {\n /**\n * 指定URLから HTML を取得し、body 内の HTML 文字列を返します。\n *\n * 振る舞い:\n * - HTTP ステータスが成功以外の場合は例外を投げます。\n * - HTML のパースに失敗した場合はログを出力し、テキスト全体を返します(フォールバック)。\n * - body タグが存在しない場合もテキスト全体を返します(フォールバック)。\n *\n * @param url 取得先の URL\n * @param init fetch のオプション(任意)\n * @returns body 内の HTML 文字列\n */\n public static async load(url: string, init?: RequestInit): Promise<string> {\n let response: Response;\n try {\n response = await fetch(url, init);\n } catch (e) {\n Log.error('[Haori]', 'Failed to fetch import source:', url, e);\n throw new Error(`Failed to fetch: ${url}`);\n }\n\n if (!response.ok) {\n // ネットワーク/HTTP エラーは上位で扱いやすいように例外化\n const status = `${response.status} ${response.statusText}`;\n Log.error('[Haori]', 'Import HTTP error:', url, status);\n throw new Error(`Failed to load ${url}: ${status}`);\n }\n\n let text: string;\n try {\n text = await response.text();\n } catch (e) {\n Log.error('[Haori]', 'Failed to read response text:', url, e);\n throw new Error(`Failed to read response from: ${url}`);\n }\n\n // HTML としてパースし、body 内のみを返す\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(text, 'text/html');\n if (doc && doc.body) {\n return doc.body.innerHTML;\n }\n Log.warn('[Haori]', 'No body found in imported document:', url);\n return text;\n } catch (e) {\n // パース失敗時はフォールバックとしてテキスト全体を返す\n Log.error('[Haori]', 'Failed to parse imported HTML:', url, e);\n return text;\n }\n }\n}\n","/**\n * @fileoverview Core機能\n *\n * Fragmentの管理、属性変化の監視、条件分岐・繰り返し処理など、\n * アプリケーションの中心的な機能を提供します。\n */\nimport Env from './env';\nimport Dev from './dev';\nimport Expression from './expression';\nimport Form from './form';\nimport Fragment, {ElementFragment, TextFragment} from './fragment';\nimport Log from './log';\nimport Procedure from './procedure';\nimport Url from './url';\nimport {Import} from './import';\nimport Queue from './queue';\nimport HaoriEvent from './event';\n\ninterface ReactiveFetchState {\n lastSignature: string | null;\n running: boolean;\n rerunRequested: boolean;\n}\n\ninterface ReactiveImportState {\n lastUrl: string | null;\n running: boolean;\n rerunRequested: boolean;\n}\n\ntype DerivedSubtreeSignatureSource = 'evaluateAll' | 'refresh';\n\ninterface DerivedSubtreeProfile {\n hostId: string;\n signatureComputeTotal: number;\n signatureComputeFromEvaluateAll: number;\n signatureComputeFromRefresh: number;\n skipHitCount: number;\n skipMissCount: number;\n skipIneligibleCount: number;\n}\n\n/**\n * アプリケーションの中心的な制御を行うクラスです。\n * Fragment の初期化、属性変化の処理、条件分岐・繰り返し処理を管理します。\n */\nexport default class Core {\n /** 属性エイリアスのサフィックス */\n private static readonly ATTRIBUTE_ALIAS_SUFFIX = 'attr-';\n\n /** 優先処理する属性のサフィックス(処理順序で定義) */\n private static readonly PRIORITY_ATTRIBUTE_SUFFIXES = [\n 'bind',\n 'url-param',\n 'derive-name',\n 'derive',\n 'if',\n 'each',\n ];\n\n /** 遅延処理する属性のサフィックス */\n private static readonly DEFERRED_ATTRIBUTE_SUFFIXES = ['fetch'];\n\n /** evaluateAll で再評価対象から除外する特殊属性のサフィックス */\n private static readonly EVALUATE_ALL_EXCLUDED_ATTRIBUTE_SUFFIXES = [\n 'bind',\n 'derive',\n 'derive-name',\n 'if',\n 'each',\n 'fetch',\n 'import',\n 'url-param',\n ];\n\n /** 属性内プレースホルダ検出用の正規表現 */\n private static readonly ATTRIBUTE_PLACEHOLDER_REGEX =\n /\\{\\{\\{[\\s\\S]+?\\}\\}\\}|\\{\\{[\\s\\S]+?\\}\\}/;\n\n /** data-fetch の自動再評価状態 */\n private static readonly REACTIVE_FETCH_STATES = new WeakMap<\n HTMLElement,\n ReactiveFetchState\n >();\n\n /** data-import の自動再評価状態 */\n private static readonly REACTIVE_IMPORT_STATES = new WeakMap<\n HTMLElement,\n ReactiveImportState\n >();\n\n /** data-derive subtree skip の開発用プロファイル */\n private static readonly DERIVE_SUBTREE_PROFILES = new WeakMap<\n ElementFragment,\n DerivedSubtreeProfile\n >();\n\n /**\n * 遅延属性かどうか(完全名で判定)を判定します。\n *\n * @param name 属性名\n * @returns 遅延属性かどうか\n */\n private static isDeferredAttributeName(name: string): boolean {\n return Core.DEFERRED_ATTRIBUTE_SUFFIXES.some(\n suffix => name === `${Env.prefix}${suffix}`,\n );\n }\n\n /**\n * evaluateAll で再評価対象から除外する特殊属性かどうかを判定します。\n *\n * @param name 属性名\n * @returns 除外対象かどうか\n */\n private static isEvaluateAllExcludedAttributeName(name: string): boolean {\n return Core.EVALUATE_ALL_EXCLUDED_ATTRIBUTE_SUFFIXES.some(\n suffix => name === `${Env.prefix}${suffix}`,\n );\n }\n\n /**\n * evaluateAll で通常属性を再評価すべきかを判定します。\n *\n * @param name 属性名\n * @param value 属性の生値\n * @returns 再評価する場合は true\n */\n private static shouldReevaluateAttribute(\n name: string,\n value: string | null,\n ): boolean {\n return (\n value !== null &&\n !Core.isEvaluateAllExcludedAttributeName(name) &&\n Core.ATTRIBUTE_PLACEHOLDER_REGEX.test(value)\n );\n }\n\n /**\n * data-attr-* 形式の属性名から実際に更新する属性名を取得します。\n *\n * @param name 属性名\n * @returns 実際の属性名。data-attr-* でない場合は null\n */\n private static getAliasedAttributeName(name: string): string | null {\n const aliasPrefix = `${Env.prefix}${Core.ATTRIBUTE_ALIAS_SUFFIX}`;\n if (!name.startsWith(aliasPrefix) || name.length <= aliasPrefix.length) {\n return null;\n }\n return name.slice(aliasPrefix.length);\n }\n\n /**\n * 実属性の変更が data-attr-* の内部反映かどうかを判定します。\n *\n * @param element 対象要素\n * @param name 変更された属性名\n * @returns data-attr-* の内部反映なら true\n */\n public static isAliasedAttributeReflection(\n element: HTMLElement,\n name: string,\n ): boolean {\n const fragment = Fragment.get(element);\n if (!(fragment instanceof ElementFragment)) {\n return false;\n }\n return fragment.hasAttribute(\n `${Env.prefix}${Core.ATTRIBUTE_ALIAS_SUFFIX}${name}`,\n );\n }\n\n /**\n * プレースホルダを含む通常属性を再評価します。\n * 内部状態の更新は同期的に行い、DOM 反映は fragment 側の非同期更新に委ねます。\n *\n * @param fragment 対象フラグメント\n * @returns 再評価完了の Promise\n */\n private static reevaluateInterpolatedAttributes(\n fragment: ElementFragment,\n ): Promise<void> {\n let chain = Promise.resolve();\n for (const name of fragment.getAttributeNames()) {\n const rawValue = fragment.getRawAttribute(name);\n if (!Core.shouldReevaluateAttribute(name, rawValue)) {\n continue;\n }\n chain = chain.then(() =>\n Core.setAttribute(fragment.getTarget(), name, rawValue),\n );\n }\n return chain.then(() => undefined);\n }\n\n /**\n * 指定フラグメントの直下の子孫評価を再実行します。\n *\n * @param fragment 対象フラグメント\n * @returns 再評価完了の Promise\n */\n private static reevaluateChildren(fragment: ElementFragment): Promise<void> {\n const promises: Promise<void>[] = [];\n fragment.getChildren().forEach(child => {\n if (child instanceof ElementFragment) {\n promises.push(Core.evaluateAll(child));\n } else if (child instanceof TextFragment) {\n promises.push(Core.evaluateText(child));\n }\n });\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * data-fetch の再評価状態を取得します。\n *\n * @param element 対象要素\n * @returns 再評価状態\n */\n private static getReactiveFetchState(\n element: HTMLElement,\n ): ReactiveFetchState {\n const existing = Core.REACTIVE_FETCH_STATES.get(element);\n if (existing) {\n return existing;\n }\n const state: ReactiveFetchState = {\n lastSignature: null,\n running: false,\n rerunRequested: false,\n };\n Core.REACTIVE_FETCH_STATES.set(element, state);\n return state;\n }\n\n /**\n * data-import の再評価状態を取得します。\n *\n * @param element 対象要素\n * @returns 再評価状態\n */\n private static getReactiveImportState(\n element: HTMLElement,\n ): ReactiveImportState {\n const existing = Core.REACTIVE_IMPORT_STATES.get(element);\n if (existing) {\n return existing;\n }\n const state: ReactiveImportState = {\n lastUrl: null,\n running: false,\n rerunRequested: false,\n };\n Core.REACTIVE_IMPORT_STATES.set(element, state);\n return state;\n }\n\n /**\n * bind 更新時に data-fetch / data-import を専用ルートで再評価します。\n *\n * @param fragment 対象フラグメント\n * @param skipFragments 再評価をスキップするフラグメント集合\n * @returns 再評価完了の Promise\n */\n private static reevaluateReactiveSpecialAttributes(\n fragment: ElementFragment,\n skipFragments: ReadonlySet<ElementFragment> = new Set(),\n ): Promise<void> {\n if (skipFragments.has(fragment)) {\n return Promise.resolve();\n }\n const promises: Promise<void>[] = [];\n if (fragment.hasAttribute(`${Env.prefix}fetch`)) {\n promises.push(Core.executeManagedFetch(fragment));\n }\n if (fragment.hasAttribute(`${Env.prefix}import`)) {\n promises.push(Core.executeManagedImport(fragment));\n }\n fragment.getChildren().forEach(child => {\n if (child instanceof ElementFragment) {\n promises.push(\n Core.reevaluateReactiveSpecialAttributes(child, skipFragments),\n );\n }\n });\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * data-fetch をシグネチャ比較付きで実行します。\n *\n * @param fragment 対象フラグメント\n * @returns 実行完了の Promise\n */\n private static executeManagedFetch(fragment: ElementFragment): Promise<void> {\n const target = fragment.getTarget();\n const state = Core.getReactiveFetchState(target);\n const resolved = Procedure.resolveAutoFetchSignature(fragment);\n\n if (state.running) {\n if (\n resolved.hasUnresolvedReference ||\n resolved.signature !== state.lastSignature\n ) {\n state.rerunRequested = true;\n }\n return Promise.resolve();\n }\n\n if (resolved.hasUnresolvedReference || resolved.signature === null) {\n state.lastSignature = null;\n return Promise.resolve();\n }\n\n if (state.lastSignature === resolved.signature) {\n return Promise.resolve();\n }\n\n state.lastSignature = resolved.signature;\n state.running = true;\n return new Procedure(fragment, null)\n .runWithResult()\n .then(() => undefined)\n .finally(() => {\n state.running = false;\n if (state.rerunRequested) {\n state.rerunRequested = false;\n return Core.executeManagedFetch(fragment);\n }\n return undefined;\n });\n }\n\n /**\n * data-import を URL 比較付きで実行します。\n *\n * @param fragment 対象フラグメント\n * @returns 実行完了の Promise\n */\n private static executeManagedImport(\n fragment: ElementFragment,\n ): Promise<void> {\n const target = fragment.getTarget();\n const state = Core.getReactiveImportState(target);\n const importEvaluation = fragment.getAttributeEvaluation(\n `${Env.prefix}import`,\n );\n const resolvedUrl =\n importEvaluation &&\n !importEvaluation.hasUnresolvedReference &&\n typeof importEvaluation.value === 'string' &&\n importEvaluation.value !== ''\n ? importEvaluation.value\n : null;\n\n if (state.running) {\n if (resolvedUrl !== state.lastUrl) {\n state.rerunRequested = true;\n }\n return Promise.resolve();\n }\n\n if (resolvedUrl === null) {\n state.lastUrl = null;\n return Promise.resolve();\n }\n\n if (state.lastUrl === resolvedUrl) {\n return Promise.resolve();\n }\n\n state.lastUrl = resolvedUrl;\n state.running = true;\n const startedAt = performance.now();\n target.setAttribute(`${Env.prefix}importing`, '');\n HaoriEvent.importStart(target, resolvedUrl);\n\n return Import.load(resolvedUrl)\n .then(html => {\n const bytes = new TextEncoder().encode(html).length;\n return Queue.enqueue(() => {\n target.innerHTML = html;\n }).then(() => {\n target.removeAttribute(`${Env.prefix}importing`);\n HaoriEvent.importEnd(target, resolvedUrl, bytes, startedAt);\n if (!document.body.hasAttribute('data-haori-ready')) {\n const childPromises: Promise<void>[] = [];\n target.childNodes.forEach(node => {\n const child = Fragment.get(node);\n if (child instanceof ElementFragment) {\n childPromises.push(Core.scan(child.getTarget()));\n } else if (child instanceof TextFragment) {\n childPromises.push(Core.evaluateText(child));\n }\n });\n return Promise.all(childPromises).then(() => undefined);\n }\n return undefined;\n });\n })\n .catch(error => {\n target.removeAttribute(`${Env.prefix}importing`);\n HaoriEvent.importError(target, resolvedUrl, error);\n Log.error('[Haori]', 'Failed to import HTML:', resolvedUrl, error);\n })\n .finally(() => {\n state.running = false;\n if (state.rerunRequested) {\n state.rerunRequested = false;\n return Core.executeManagedImport(fragment);\n }\n return undefined;\n }) as Promise<void>;\n }\n\n /**\n * 指定された要素と、その子要素をスキャンし、Fragmentを生成します。\n *\n * @param element スキャン対象の要素\n * @returns Promise (スキャンが完了したときに解決される)\n */\n public static scan(element: HTMLElement): Promise<void> {\n const fragment = Fragment.get(element);\n if (!fragment) {\n return Promise.resolve();\n }\n return Core.initializeElementFragment(fragment, false);\n }\n\n /**\n * 新規 each 行を局所初期化します。\n * 既存 scan の属性順序を保ちつつ、Fragment 木を直接たどります。\n *\n * @param fragment 新規挿入された行フラグメント\n * @returns 初期化完了の Promise\n */\n private static initializeFreshEachRow(\n fragment: ElementFragment,\n ): Promise<void> {\n return Core.initializeElementFragment(fragment, true).then(() => {\n if (Core.needsScheduledEvaluateAll(fragment)) {\n Core.scheduleEvaluateAll(fragment);\n }\n return undefined;\n });\n }\n\n /**\n * ElementFragment とその子孫を初期化します。\n *\n * @param fragment 対象フラグメント\n * @param stopAtEach true の場合、data-each 要素では通常再帰を止める\n * @returns 初期化完了の Promise\n */\n private static initializeElementFragment(\n fragment: ElementFragment,\n stopAtEach: boolean,\n ): Promise<void> {\n Core.syncMountedState(fragment);\n if (stopAtEach && fragment.isFreshInitializationSkippable()) {\n return Promise.resolve();\n }\n return Core.initializeElementAttributes(fragment).then(() => {\n if (Core.shouldSkipChildInitialization(fragment, stopAtEach)) {\n Core.refreshDerivedSubtreeSignature(fragment);\n return undefined;\n }\n const childPromises: Promise<void>[] = [];\n fragment.getChildren().forEach(child => {\n if (child instanceof ElementFragment) {\n childPromises.push(Core.initializeElementFragment(child, stopAtEach));\n } else if (child instanceof TextFragment) {\n childPromises.push(Core.evaluateText(child));\n }\n });\n return Promise.all(childPromises).then(() => {\n Core.refreshDerivedSubtreeSignature(fragment);\n return undefined;\n });\n });\n }\n\n /**\n * 要素初期化時の mounted 状態を同期します。\n *\n * @param fragment 対象フラグメント\n */\n private static syncMountedState(fragment: ElementFragment): void {\n const parent = fragment.getParent();\n if (parent?.isMounted()) {\n fragment.setMounted(true);\n return;\n }\n const target = fragment.getTarget();\n if (target.parentNode && document.body.contains(target)) {\n fragment.setMounted(true);\n return;\n }\n fragment.setMounted(false);\n }\n\n /**\n * scan と fresh clone 初期化で共有する属性初期化を行います。\n *\n * @param fragment 対象フラグメント\n * @returns 属性初期化完了の Promise\n */\n private static initializeElementAttributes(\n fragment: ElementFragment,\n ): Promise<void> {\n let attributeChain = Promise.resolve();\n const processedAttributes = new Set<string>();\n for (const suffix of Core.PRIORITY_ATTRIBUTE_SUFFIXES) {\n // 優先属性の処理\n const name = Env.prefix + suffix;\n if (fragment.hasAttribute(name)) {\n attributeChain = attributeChain.then(() =>\n Core.setAttribute(\n fragment.getTarget(),\n name,\n fragment.getRawAttribute(name),\n ),\n );\n processedAttributes.add(name);\n }\n }\n for (const name of fragment.getAttributeNames()) {\n if (processedAttributes.has(name) || Core.isDeferredAttributeName(name)) {\n // すでに処理済みもしくは遅延処理の属性はスキップ\n continue;\n }\n const value = fragment.getRawAttribute(name);\n if (value !== null) {\n attributeChain = attributeChain.then(() =>\n Core.setAttribute(fragment.getTarget(), name, value),\n );\n }\n }\n for (const suffix of Core.DEFERRED_ATTRIBUTE_SUFFIXES) {\n // 遅延属性の処理\n const name = Env.prefix + suffix;\n if (fragment.hasAttribute(name)) {\n attributeChain = attributeChain.then(() =>\n Core.setAttribute(\n fragment.getTarget(),\n name,\n fragment.getRawAttribute(name),\n ),\n );\n processedAttributes.add(name);\n }\n }\n return attributeChain.then(() => undefined);\n }\n\n /**\n * 子孫初期化をスキップすべきかどうかを返します。\n *\n * @param fragment 対象フラグメント\n * @param stopAtEach true の場合、data-each 要素で通常再帰を止める\n * @returns 子孫初期化をスキップするなら true\n */\n private static shouldSkipChildInitialization(\n fragment: ElementFragment,\n stopAtEach: boolean,\n ): boolean {\n const condition = fragment.getAttribute(`${Env.prefix}if`);\n if (\n fragment.hasAttribute(`${Env.prefix}if`) &&\n (condition === false ||\n condition === undefined ||\n condition === null ||\n Number.isNaN(condition))\n ) {\n return true;\n }\n return stopAtEach && fragment.hasAttribute(`${Env.prefix}each`);\n }\n\n /**\n * エレメントに属性を設定します。\n * 属性固有の処理も行います。\n *\n * @param element エレメント\n * @param name 属性名\n * @param value 属性値\n * @returns Promise (DOM操作が完了したときに解決される)\n */\n public static setAttribute(\n element: HTMLElement,\n name: string,\n value: string | null,\n fromObserver = false,\n ): Promise<void> {\n const fragment = Fragment.get(element);\n const aliasedAttributeName = Core.getAliasedAttributeName(name);\n if (aliasedAttributeName !== null) {\n if (value === null) {\n return fragment.removeAliasedAttribute(name, aliasedAttributeName);\n }\n return fragment.setAliasedAttribute(\n name,\n aliasedAttributeName,\n value,\n fromObserver,\n );\n }\n const promises: Promise<void>[] = [];\n let deriveChangedPromise: Promise<boolean> | null = null;\n let nextDeriveInputSignature: string | null = null;\n switch (name) {\n case `${Env.prefix}bind`: {\n if (value === null) {\n fragment.clearBindingDataCache();\n fragment.setBindingData({});\n } else {\n fragment.setBindingData(Core.parseDataBind(value));\n }\n break;\n }\n case `${Env.prefix}derive`:\n nextDeriveInputSignature = Core.createDeriveInputSignature(\n fragment,\n value,\n fragment.getRawAttribute(`${Env.prefix}derive-name`),\n );\n deriveChangedPromise = Core.evaluateDerive(\n fragment,\n value,\n fragment.getRawAttribute(`${Env.prefix}derive-name`),\n );\n promises.push(deriveChangedPromise.then(() => undefined));\n break;\n case `${Env.prefix}derive-name`:\n nextDeriveInputSignature = Core.createDeriveInputSignature(\n fragment,\n fragment.getRawAttribute(`${Env.prefix}derive`),\n value,\n );\n deriveChangedPromise = Core.evaluateDerive(\n fragment,\n fragment.getRawAttribute(`${Env.prefix}derive`),\n value,\n );\n promises.push(deriveChangedPromise.then(() => undefined));\n break;\n case `${Env.prefix}if`:\n promises.push(Core.evaluateIf(fragment));\n break;\n case `${Env.prefix}each`:\n promises.push(Core.evaluateEach(fragment));\n break;\n case `${Env.prefix}fetch`:\n promises.push(Core.executeManagedFetch(fragment));\n break;\n case `${Env.prefix}import`:\n if (typeof value === 'string') {\n promises.push(Core.executeManagedImport(fragment));\n }\n break;\n case `${Env.prefix}url-param`: {\n const arg = fragment.getAttribute(`${Env.prefix}url-arg`);\n const params = Url.readParams();\n if (arg === null) {\n promises.push(Core.setBindingData(element, params));\n } else {\n const data = fragment.getRawBindingData() || {};\n data[String(arg)] = params;\n promises.push(Core.setBindingData(element, data));\n }\n break;\n }\n }\n if (value === null) {\n promises.push(fragment.removeAttribute(name));\n } else {\n promises.push(fragment.setAttribute(name, value, fromObserver));\n }\n return Promise.all(promises)\n .then(() => {\n if (deriveChangedPromise !== null) {\n fragment.setDeriveInputSignature(nextDeriveInputSignature);\n return deriveChangedPromise.then(changed => {\n if (!changed) {\n return undefined;\n }\n return Core.reevaluateChildren(fragment);\n });\n }\n return undefined;\n })\n .then(() => undefined);\n }\n\n /**\n * エレメントに属性を設定し、評価を行います。\n *\n * @param element エレメント\n * @param name 属性名\n * @param value 属性値\n * @returns Promise (DOM操作が完了したときに解決される)\n */\n public static setBindingData(\n element: HTMLElement,\n data: Record<string, unknown>,\n skipFragments: ReadonlySet<ElementFragment> = new Set(),\n ): Promise<void> {\n const fragment = Fragment.get(element) as ElementFragment;\n const previous = fragment.getRawBindingData();\n fragment.setBindingData(data);\n let chain = fragment.setAttribute(\n `${Env.prefix}bind`,\n JSON.stringify(data),\n );\n if (element.tagName === 'FORM') {\n const arg = fragment.getAttribute(`${Env.prefix}form-arg`);\n const formValues =\n arg &&\n data[String(arg)] &&\n typeof data[String(arg)] === 'object' &&\n !Array.isArray(data[String(arg)])\n ? (data[String(arg)] as Record<string, unknown>)\n : arg\n ? {}\n : data;\n chain = chain.then(() => Form.syncValues(fragment, formValues));\n }\n chain = chain.then(() => Core.evaluateAll(fragment, skipFragments));\n chain = chain.then(() =>\n Core.reevaluateReactiveSpecialAttributes(fragment, skipFragments),\n );\n\n // bindchangeイベントを発火\n HaoriEvent.bindChange(element, previous, data, 'manual');\n\n return chain.then(() => undefined);\n }\n\n /**\n * data-bind 属性の値をパースします。\n *\n * @param data data-bind 属性の値\n * @returns パースされたデータオブジェクト\n */\n public static parseDataBind(data: string): Record<string, unknown> {\n if (data.startsWith('{') || data.startsWith('[')) {\n // JSONとしてパース\n try {\n return JSON.parse(data);\n } catch (e) {\n Log.error('[Haori]', 'Invalid JSON in data-bind:', e);\n return {};\n }\n } else {\n // URLSearchParamsでパース\n const params = new URLSearchParams(data);\n const result: Record<string, unknown> = {};\n for (const [key, value] of params.entries()) {\n if (result[key] !== undefined) {\n // すでに値がある場合は配列化\n if (Array.isArray(result[key])) {\n (result[key] as string[]).push(value);\n } else {\n result[key] = [result[key], value];\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n }\n\n /**\n * ノードを親要素に追加し評価を行います。\n *\n * @param parentElement 親エレメント\n * @param node 追加するノード\n */\n public static addNode(parentElement: HTMLElement, node: Node) {\n const parent = Fragment.get(parentElement);\n // skipMutationNodesが設定されている場合は処理をスキップ\n if (parent.isSkipMutationNodes()) {\n return;\n }\n const next = Fragment.get(node.nextSibling);\n const fragment = Fragment.get(node);\n if (fragment) {\n parent.insertBefore(fragment, next);\n if (fragment instanceof ElementFragment) {\n // 新規追加ノードは属性評価(bind/if/each/import など含む)のフルスキャンを行う。\n // これにより、取り込まれた断片内の data-import の入れ子や data-bind も正しく処理される。\n Core.scan(fragment.getTarget());\n } else if (fragment instanceof TextFragment) {\n Core.evaluateText(fragment);\n }\n }\n }\n\n /**\n * ノードを親要素から削除します。\n *\n * @param node 削除するノード\n */\n public static removeNode(node: Node) {\n const fragment = Fragment.get(node);\n if (fragment) {\n const parent = fragment.getParent();\n // skipMutationNodesが設定されている場合は処理をスキップ\n if (parent && parent.isSkipMutationNodes()) {\n return;\n }\n fragment.remove();\n }\n }\n\n /**\n * ノードのテキストを変更します。\n *\n * @param node 変更するノード\n * @param text 新しいテキスト\n */\n public static changeText(node: Text | Comment, text: string) {\n const fragment = Fragment.get(node);\n if (fragment) {\n fragment.setContent(text);\n }\n }\n\n /**\n * エレメントの値を変更します。\n * フォームの双方向バインディングを考慮し、フォームのバインドデータも更新します。\n *\n * @param element 変更するエレメント\n * @param value 新しい値\n * @returns Promise (DOM操作が完了したときに解決される)\n */\n public static changeValue(\n element: HTMLElement,\n value: string,\n ): Promise<void> {\n const fragment = Fragment.get(element);\n if (fragment.getValue() === value) {\n return Promise.resolve();\n }\n const promises: Promise<void>[] = [];\n promises.push(fragment.setValue(value));\n const formFragment = Core.getFormFragment(fragment);\n if (formFragment) {\n const values = Form.getValues(formFragment);\n const arg = formFragment.getAttribute(`${Env.prefix}form-arg`);\n let bindingData;\n if (arg) {\n bindingData = formFragment.getRawBindingData();\n if (!bindingData) {\n bindingData = {};\n }\n bindingData[String(arg)] = values;\n } else {\n bindingData = values;\n }\n promises.push(Core.setBindingData(formFragment.getTarget(), bindingData));\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * フォームフラグメントを取得します。\n *\n * @param fragment フラグメント\n * @returns フォームフラグメントまたはnull\n */\n private static getFormFragment(\n fragment: ElementFragment,\n ): ElementFragment | null {\n if (fragment.getTarget() instanceof HTMLFormElement) {\n return fragment;\n }\n const parent = fragment.getParent();\n if (parent) {\n return Core.getFormFragment(parent);\n }\n return null;\n }\n\n /**\n * フラグメントとその子要素を評価します。\n *\n * @param fragment 対象フラグメント\n * @return Promise (DOM操作が完了したときに解決される)\n */\n public static evaluateAll(\n fragment: ElementFragment,\n skipFragments: ReadonlySet<ElementFragment> = new Set(),\n ): Promise<void> {\n if (skipFragments.has(fragment)) {\n return Promise.resolve();\n }\n let chain = Core.reevaluateInterpolatedAttributes(fragment);\n const hasDerive = fragment.hasAttribute(`${Env.prefix}derive`);\n const hasIf = fragment.hasAttribute(`${Env.prefix}if`);\n const hasEach = fragment.hasAttribute(`${Env.prefix}each`);\n const deriveExpression = fragment.getRawAttribute(`${Env.prefix}derive`);\n const deriveName = fragment.getRawAttribute(`${Env.prefix}derive-name`);\n let shouldSkipDerivedSubtree = false;\n let shouldRecordDerivedSubtreeSignature = false;\n let nextDerivedSubtreeSignature: string | null = null;\n if (!hasDerive && fragment.getDeriveSubtreeSignature() !== null) {\n fragment.setDeriveSubtreeSignature(null);\n }\n if (!hasDerive && fragment.getDeriveInputSignature() !== null) {\n fragment.setDeriveInputSignature(null);\n }\n if (hasDerive) {\n const nextDeriveInputSignature = Core.createDeriveInputSignature(\n fragment,\n deriveExpression,\n deriveName,\n );\n if (nextDeriveInputSignature === null) {\n if (fragment.getDeriveInputSignature() !== null) {\n fragment.setDeriveInputSignature(null);\n }\n chain = chain.then(() =>\n Core.evaluateDerive(fragment, deriveExpression, deriveName).then(\n () => undefined,\n ),\n );\n } else if (\n fragment.getDeriveInputSignature() !== nextDeriveInputSignature\n ) {\n chain = chain.then(() => {\n return Core.evaluateDerive(\n fragment,\n deriveExpression,\n deriveName,\n ).then(() => {\n fragment.setDeriveInputSignature(nextDeriveInputSignature);\n return undefined;\n });\n });\n }\n }\n if (hasIf) {\n chain = chain.then(() => Core.evaluateIf(fragment));\n }\n if (hasEach) {\n if (fragment.getDeriveSubtreeSignature() !== null) {\n fragment.setDeriveSubtreeSignature(null);\n }\n return chain.then(() => Core.evaluateEach(fragment));\n }\n if (hasIf) {\n if (fragment.getDeriveSubtreeSignature() !== null) {\n fragment.setDeriveSubtreeSignature(null);\n }\n return chain.then(() => undefined);\n }\n if (hasDerive) {\n chain = chain.then(() => {\n if (!Core.canSkipStableDerivedSubtree(fragment)) {\n fragment.setDeriveSubtreeSignature(null);\n Core.logDerivedSubtreeProfileSnapshot(fragment, 'skip-ineligible');\n return;\n }\n nextDerivedSubtreeSignature = Core.createDescendantBindingSignature(\n fragment,\n 'evaluateAll',\n );\n shouldRecordDerivedSubtreeSignature = true;\n shouldSkipDerivedSubtree =\n fragment.getDeriveSubtreeSignature() !== null &&\n fragment.getDeriveSubtreeSignature() === nextDerivedSubtreeSignature;\n Core.logDerivedSubtreeProfileSnapshot(\n fragment,\n shouldSkipDerivedSubtree ? 'skip-hit' : 'skip-miss',\n );\n });\n }\n return chain\n .then(() => {\n if (shouldSkipDerivedSubtree) {\n return undefined;\n }\n const promises: Promise<void>[] = [];\n fragment.getChildren().forEach(child => {\n if (child instanceof ElementFragment) {\n if (Core.canSkipUnchangedNestedEach(child)) {\n return;\n }\n promises.push(Core.evaluateAll(child, skipFragments));\n } else if (child instanceof TextFragment) {\n promises.push(Core.evaluateText(child));\n }\n });\n return Promise.all(promises).then(() => undefined);\n })\n .then(() => {\n if (\n shouldRecordDerivedSubtreeSignature &&\n nextDerivedSubtreeSignature !== null\n ) {\n fragment.setDeriveSubtreeSignature(nextDerivedSubtreeSignature);\n }\n return undefined;\n });\n }\n\n /**\n * data-derive / data-derive-name を評価し、子孫要素向けの派生値を更新します。\n *\n * @param fragment 対象フラグメント\n * @param deriveExpression 上書きする導出式\n * @param deriveName 上書きする導出名\n * @returns Promise (評価完了時に解決)\n */\n public static evaluateDerive(\n fragment: ElementFragment,\n deriveExpression: string | null = fragment.getRawAttribute(\n `${Env.prefix}derive`,\n ),\n deriveName: string | null = fragment.getRawAttribute(\n `${Env.prefix}derive-name`,\n ),\n ): Promise<boolean> {\n const previousDerivedBindingData = fragment.getRawDerivedBindingData();\n const normalizedName =\n typeof deriveName === 'string' ? deriveName.trim() : '';\n if (!deriveExpression || normalizedName === '') {\n if (previousDerivedBindingData === null) {\n return Promise.resolve(false);\n }\n fragment.setDerivedBindingData(null);\n return Promise.resolve(true);\n }\n const result = Expression.evaluateDetailed(\n deriveExpression,\n fragment.getBindingData(),\n );\n if (result.unresolvedReference) {\n if (previousDerivedBindingData === null) {\n return Promise.resolve(false);\n }\n fragment.setDerivedBindingData(null);\n return Promise.resolve(true);\n }\n const nextDerivedBindingData = {\n [normalizedName]: result.value,\n };\n if (\n Core.createBindingSignature(previousDerivedBindingData) ===\n Core.createBindingSignature(nextDerivedBindingData)\n ) {\n return Promise.resolve(false);\n }\n fragment.setDerivedBindingData(nextDerivedBindingData);\n return Promise.resolve(true);\n }\n\n /**\n * テキストフラグメントを評価します。\n *\n * @param fragment 対象フラグメント\n * @returns Promise (DOM操作が完了したときに解決される)\n */\n public static evaluateText(fragment: TextFragment): Promise<void> {\n return fragment.evaluate();\n }\n\n /**\n * if要素を評価します。\n * 値がfalse、null、undefined、NaNの場合は非表示にし、それ以外の場合は表示します。\n *\n * @param fragment 対象フラグメント\n * @return Promise (DOM操作が完了したときに解決される)\n */\n public static evaluateIf(fragment: ElementFragment): Promise<void> {\n const promises: Promise<void>[] = [];\n const condition = fragment.getAttribute(`${Env.prefix}if`);\n if (\n condition === false ||\n condition === undefined ||\n condition === null ||\n Number.isNaN(condition)\n ) {\n promises.push(\n fragment.hide().then(() => {\n HaoriEvent.hide(fragment.getTarget());\n }),\n );\n } else {\n const childPromises: Promise<void>[] = [];\n fragment.getChildren().forEach(child => {\n if (child instanceof ElementFragment) {\n // 未スキャンの子は scan で初期化し、既に表示済みの子は再評価だけ行う。\n childPromises.push(\n child.isMounted()\n ? Core.evaluateAll(child)\n : Core.scan(child.getTarget()),\n );\n } else if (child instanceof TextFragment) {\n childPromises.push(Core.evaluateText(child));\n }\n });\n promises.push(\n fragment.show().then(() => {\n HaoriEvent.show(fragment.getTarget());\n }),\n );\n promises.push(Promise.all(childPromises).then(() => undefined));\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * each要素を評価します。\n * 非表示または未マウントの場合は処理をスキップします。\n *\n * @param fragment 対象フラグメント\n */\n public static evaluateEach(fragment: ElementFragment): Promise<void> {\n if (!fragment.isVisible() || !fragment.isMounted()) {\n return Promise.resolve();\n }\n const data = Core.resolveEachItems(fragment);\n if (data === null) {\n return Promise.reject(new Error('Invalid each attribute.'));\n }\n let template = fragment.getTemplate();\n const keyArg = fragment.getAttribute(`${Env.prefix}each-key`);\n const nextEachInputSignature = Core.createBindingSignature({\n key: keyArg ? String(keyArg) : null,\n items: data,\n });\n if (template === null) {\n // テンプレートの作成\n let found = false;\n fragment.getChildren().forEach(child => {\n if (found) {\n return;\n }\n if (child instanceof ElementFragment) {\n if (\n child.hasAttribute(`${Env.prefix}each-before`) ||\n child.hasAttribute(`${Env.prefix}each-after`)\n ) {\n return;\n }\n // 最初のElementFragmentをテンプレートとして採用\n template = child.clone();\n Core.markFreshInitializationSkippable(template);\n fragment.setTemplate(template);\n found = true;\n // 元のchildはchildrenから除外\n fragment.removeChild(child);\n // DOMからも必ず除去\n const templateTarget = child.getTarget();\n if (templateTarget.parentNode) {\n templateTarget.parentNode.removeChild(templateTarget);\n }\n child.setMounted(false);\n }\n // TextNodeやCommentNodeはテンプレートにならないので無視\n });\n // テンプレートのunmount完了後にupdateDiffを実行\n return this.updateDiff(fragment, data).then(() => {\n fragment.setEachInputSignature(nextEachInputSignature);\n });\n }\n if (fragment.getEachInputSignature() === nextEachInputSignature) {\n return Promise.resolve();\n }\n return this.updateDiff(fragment, data).then(() => {\n fragment.setEachInputSignature(nextEachInputSignature);\n });\n }\n\n /**\n * data-each 属性値を仕様に従って配列へ正規化します。\n *\n * @param fragment 対象フラグメント\n * @returns 配列。無効な場合は null\n */\n private static resolveEachItems(\n fragment: ElementFragment,\n ): (Record<string, unknown> | string | number)[] | null {\n const evaluation = fragment.getAttributeEvaluation(`${Env.prefix}each`);\n const data = evaluation?.value;\n if (\n evaluation?.hasUnresolvedReference ||\n data === false ||\n data === null ||\n data === undefined\n ) {\n return [];\n }\n if (Array.isArray(data)) {\n return data as (Record<string, unknown> | string | number)[];\n }\n Log.error('[Haori]', 'Invalid each attribute:', data);\n return null;\n }\n\n /**\n * nested data-each の入力が同値で、要素自身に他の動的要素が無い場合は\n * evaluateAll の子走査を省略できるかどうかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @returns 省略可能なら true\n */\n private static canSkipUnchangedNestedEach(\n fragment: ElementFragment,\n ): boolean {\n if (!fragment.hasAttribute(`${Env.prefix}each`)) {\n return false;\n }\n if (fragment.getEachInputSignature() === null) {\n return false;\n }\n const parent = fragment.getParent();\n if (\n parent?.closestByAttribute(`${Env.prefix}derive`) ||\n parent?.closestByAttribute(`${Env.prefix}derive-name`) ||\n parent?.closestByAttribute(`${Env.prefix}if`) ||\n parent?.closestByAttribute(`${Env.prefix}fetch`) ||\n parent?.closestByAttribute(`${Env.prefix}import`)\n ) {\n return false;\n }\n if (Core.hasNonEachDynamicElementState(fragment)) {\n return false;\n }\n const data = Core.resolveEachItems(fragment);\n if (data === null) {\n return false;\n }\n const keyArg = fragment.getAttribute(`${Env.prefix}each-key`);\n const nextEachInputSignature = Core.createBindingSignature({\n key: keyArg ? String(keyArg) : null,\n items: data,\n });\n return fragment.getEachInputSignature() === nextEachInputSignature;\n }\n\n /**\n * data-derive subtree の入力が同値で、保守条件も満たす場合に\n * 子走査を省略できるかどうかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @returns 省略可能なら true\n */\n private static canSkipStableDerivedSubtree(\n fragment: ElementFragment,\n ): boolean {\n if (!fragment.hasAttribute(`${Env.prefix}derive`)) {\n return false;\n }\n if (\n fragment.hasAttribute(`${Env.prefix}if`) ||\n fragment.hasAttribute(`${Env.prefix}each`) ||\n fragment.hasAttribute(`${Env.prefix}fetch`) ||\n fragment.hasAttribute(`${Env.prefix}import`)\n ) {\n return false;\n }\n return !Core.hasDisallowedDerivedSubtreeDescendant(fragment);\n }\n\n /**\n * data-derive subtree skip の初期 PoC で扱わない子孫要素を含むかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @returns 含むなら true\n */\n private static hasDisallowedDerivedSubtreeDescendant(\n fragment: ElementFragment,\n ): boolean {\n return fragment.getChildren().some(child => {\n if (!(child instanceof ElementFragment)) {\n return false;\n }\n if (\n child.hasAttribute(`${Env.prefix}derive`) ||\n child.hasAttribute(`${Env.prefix}derive-name`) ||\n child.hasAttribute(`${Env.prefix}fetch`) ||\n child.hasAttribute(`${Env.prefix}import`)\n ) {\n return true;\n }\n return Core.hasDisallowedDerivedSubtreeDescendant(child);\n });\n }\n\n /**\n * data-derive host が子孫要素へ公開している binding の署名を返します。\n *\n * @param fragment 対象フラグメント\n * @returns binding 署名\n */\n private static createDescendantBindingSignature(\n fragment: ElementFragment,\n source: DerivedSubtreeSignatureSource,\n ): string {\n Core.recordDerivedSubtreeSignatureComputation(fragment, source);\n return Core.createBindingSignature(fragment.getDescendantBindingData());\n }\n\n /**\n * data-derive 実行前の入力署名を返します。\n *\n * @param fragment 対象フラグメント\n * @param deriveExpression 導出式\n * @param deriveName 導出名\n * @returns 入力署名。導出が無効なら null\n */\n private static createDeriveInputSignature(\n fragment: ElementFragment,\n deriveExpression: string | null,\n deriveName: string | null,\n ): string | null {\n const normalizedName =\n typeof deriveName === 'string' ? deriveName.trim() : '';\n if (!deriveExpression || normalizedName === '') {\n return null;\n }\n return Core.createBindingSignature({\n expression: deriveExpression,\n name: normalizedName,\n scope: fragment.getBindingData(),\n });\n }\n\n /**\n * data-derive subtree skip 用の署名を現在状態で更新します。\n *\n * @param fragment 対象フラグメント\n */\n private static refreshDerivedSubtreeSignature(\n fragment: ElementFragment,\n ): void {\n if (!Core.canSkipStableDerivedSubtree(fragment)) {\n fragment.setDeriveSubtreeSignature(null);\n Core.logDerivedSubtreeProfileSnapshot(fragment, 'skip-ineligible');\n return;\n }\n fragment.setDeriveSubtreeSignature(\n Core.createDescendantBindingSignature(fragment, 'refresh'),\n );\n Core.logDerivedSubtreeProfileSnapshot(fragment, 'refresh');\n }\n\n /**\n * data-derive subtree skip のプロファイルを取得または初期化します。\n *\n * @param fragment 対象フラグメント\n * @returns プロファイル\n */\n private static getOrCreateDerivedSubtreeProfile(\n fragment: ElementFragment,\n ): DerivedSubtreeProfile | null {\n if (!Dev.isEnabled() || !fragment.hasAttribute(`${Env.prefix}derive`)) {\n return null;\n }\n const existing = Core.DERIVE_SUBTREE_PROFILES.get(fragment);\n if (existing) {\n return existing;\n }\n const profile: DerivedSubtreeProfile = {\n hostId: Core.createDerivedSubtreeHostId(fragment),\n signatureComputeTotal: 0,\n signatureComputeFromEvaluateAll: 0,\n signatureComputeFromRefresh: 0,\n skipHitCount: 0,\n skipMissCount: 0,\n skipIneligibleCount: 0,\n };\n Core.DERIVE_SUBTREE_PROFILES.set(fragment, profile);\n return profile;\n }\n\n /**\n * data-derive subtree host の識別子を作成します。\n *\n * @param fragment 対象フラグメント\n * @returns host 識別子\n */\n private static createDerivedSubtreeHostId(\n fragment: ElementFragment,\n ): string {\n const segments: string[] = [];\n let current: ElementFragment | null = fragment;\n while (current) {\n const target = current.getTarget();\n if (!(target instanceof HTMLElement)) {\n break;\n }\n let segment = target.tagName.toLowerCase();\n if (target.id.trim() !== '') {\n segment += `#${target.id.trim()}`;\n segments.unshift(segment);\n break;\n }\n const deriveName = current.getRawAttribute(`${Env.prefix}derive-name`);\n if (typeof deriveName === 'string' && deriveName.trim() !== '') {\n segment += `[${Env.prefix}derive-name=\"${deriveName.trim()}\"]`;\n }\n const parent = current.getParent();\n if (parent) {\n const siblingIndex = parent\n .getChildren()\n .filter(child => child instanceof ElementFragment)\n .findIndex(child => child === current);\n segment += `:nth-child(${siblingIndex + 1})`;\n }\n segments.unshift(segment);\n current = parent;\n }\n return segments.join(' > ');\n }\n\n /**\n * data-derive subtree の署名計算回数を記録します。\n *\n * @param fragment 対象フラグメント\n * @param source 計算元\n */\n private static recordDerivedSubtreeSignatureComputation(\n fragment: ElementFragment,\n source: DerivedSubtreeSignatureSource,\n ): void {\n const profile = Core.getOrCreateDerivedSubtreeProfile(fragment);\n if (profile === null) {\n return;\n }\n profile.signatureComputeTotal += 1;\n if (source === 'refresh') {\n profile.signatureComputeFromRefresh += 1;\n return;\n }\n profile.signatureComputeFromEvaluateAll += 1;\n }\n\n /**\n * data-derive subtree の現在プロファイルをログ出力します。\n *\n * @param fragment 対象フラグメント\n * @param reason ログ理由\n */\n private static logDerivedSubtreeProfileSnapshot(\n fragment: ElementFragment,\n reason: 'refresh' | 'skip-hit' | 'skip-miss' | 'skip-ineligible',\n ): void {\n const profile = Core.getOrCreateDerivedSubtreeProfile(fragment);\n if (profile === null) {\n return;\n }\n if (reason === 'skip-hit') {\n profile.skipHitCount += 1;\n } else if (reason === 'skip-miss') {\n profile.skipMissCount += 1;\n } else if (reason === 'skip-ineligible') {\n profile.skipIneligibleCount += 1;\n }\n Log.info('[Haori][derive-profile]', {\n reason,\n hostId: profile.hostId,\n signatureComputeTotal: profile.signatureComputeTotal,\n signatureComputeFromEvaluateAll: profile.signatureComputeFromEvaluateAll,\n signatureComputeFromRefresh: profile.signatureComputeFromRefresh,\n skipHitCount: profile.skipHitCount,\n skipMissCount: profile.skipMissCount,\n skipIneligibleCount: profile.skipIneligibleCount,\n });\n }\n\n /**\n * data-each 以外の動的要素状態を持つかどうかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @returns 該当するなら true\n */\n private static hasNonEachDynamicElementState(\n fragment: ElementFragment,\n ): boolean {\n const allowedEachAttributes = new Set([\n `${Env.prefix}each`,\n `${Env.prefix}each-key`,\n `${Env.prefix}each-arg`,\n `${Env.prefix}each-index`,\n ]);\n const hasDynamicAttributes = fragment.getAttributeNames().some(name => {\n if (allowedEachAttributes.has(name)) {\n return false;\n }\n if (name.startsWith(`${Env.prefix}attr-`)) {\n return true;\n }\n if (name.startsWith(Env.prefix)) {\n return true;\n }\n const value = fragment.getRawAttribute(name);\n return typeof value === 'string' && value.includes('{{');\n });\n if (hasDynamicAttributes) {\n return true;\n }\n return fragment.getChildren().some(\n child => child instanceof TextFragment && child.hasDynamicContent(),\n );\n }\n\n /**\n * fresh clone 初期化を subtree ごと省略できるかどうかを事前計算します。\n *\n * @param fragment 判定対象フラグメント\n * @returns subtree 全体を省略可能なら true\n */\n private static markFreshInitializationSkippable(\n fragment: ElementFragment,\n ): boolean {\n const hasDynamicAttributes = fragment\n .getAttributeNames()\n .some(name => Core.isFreshInitializationDynamicAttribute(fragment, name));\n const hasDynamicChildren = fragment.getChildren().some(child => {\n if (child instanceof ElementFragment) {\n return !Core.markFreshInitializationSkippable(child);\n }\n if (child instanceof TextFragment) {\n return child.hasDynamicContent();\n }\n return false;\n });\n const skippable = !hasDynamicAttributes && !hasDynamicChildren;\n fragment.setFreshInitializationSkippable(skippable);\n return skippable;\n }\n\n /**\n * fresh clone 初期化で再評価が必要な属性かどうかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @param name 属性名\n * @returns 再評価が必要なら true\n */\n private static isFreshInitializationDynamicAttribute(\n fragment: ElementFragment,\n name: string,\n ): boolean {\n if (name.startsWith(`${Env.prefix}attr-`)) {\n return true;\n }\n if (name.startsWith(Env.prefix)) {\n return true;\n }\n const value = fragment.getRawAttribute(name);\n return typeof value === 'string' && value.includes('{{');\n }\n\n /**\n * 差分を更新します。\n *\n * @param parent 親フラグメント\n * @param newList 新しいリスト\n */\n private static updateDiff(\n parent: ElementFragment,\n newList: (Record<string, unknown> | string | number)[],\n ): Promise<void> {\n const template = parent.getTemplate();\n if (template === null) {\n Log.error('[Haori]', 'Template is not set for each element.');\n return Promise.resolve();\n }\n let indexKey = parent.getAttribute(`${Env.prefix}each-index`);\n if (indexKey) {\n indexKey = String(indexKey);\n }\n const keyArg = parent.getAttribute(`${Env.prefix}each-key`);\n const itemArg = parent.getAttribute(`${Env.prefix}each-arg`);\n const keyDataMap: Map<\n string,\n {item: (typeof newList)[0]; itemIndex: number}\n > = new Map();\n const newKeys: string[] = [];\n newList.forEach((item, itemIndex) => {\n const listKey = Core.createListKey(\n item,\n keyArg ? String(keyArg) : null,\n itemIndex,\n );\n newKeys.push(listKey);\n keyDataMap.set(listKey, {item, itemIndex});\n });\n const newKeySet = new Set(newKeys);\n const removalPromises: Promise<void>[] = [];\n let childElements = parent\n .getChildren()\n .filter(child => child instanceof ElementFragment)\n .filter(\n child =>\n !child.hasAttribute(`${Env.prefix}each-before`) &&\n !child.hasAttribute(`${Env.prefix}each-after`),\n );\n const previousKeys = childElements.map(child => child.getListKey());\n childElements = childElements.filter(child => {\n if (!newKeySet.has(String(child.getListKey()))) {\n removalPromises.push(child.remove());\n return false;\n }\n return true;\n });\n const srcKeys = childElements.map(child => child.getListKey());\n const childElementsByKey = new Map<string, ElementFragment>();\n childElements.forEach(child => {\n const listKey = child.getListKey();\n if (listKey !== null && !childElementsByKey.has(listKey)) {\n childElementsByKey.set(listKey, child);\n }\n });\n const insertTargets = parent.getChildElementFragments().slice();\n const baseInsertIndex = insertTargets.filter(child =>\n child.hasAttribute(`${Env.prefix}each-before`),\n ).length;\n let chain = Promise.resolve();\n newKeys.forEach((newKey, loopIndex) => {\n const {item, itemIndex} = keyDataMap.get(newKey)!;\n let child: ElementFragment;\n const reusedChild = childElementsByKey.get(newKey);\n if (reusedChild) {\n // 既存の要素を再利用\n child = reusedChild;\n // 行の入力が同一なら子孫の再評価をスキップする。\n chain = chain.then(() =>\n Core.updateRowFragment(\n child,\n item,\n indexKey as string | null,\n itemIndex,\n itemArg ? String(itemArg) : null,\n newKey,\n ).then(changed => {\n if (!changed) {\n return undefined;\n }\n return Core.evaluateAll(child);\n }),\n );\n } else {\n // 新しい要素を追加\n child = template.clone();\n const currentInsertIndex = baseInsertIndex + loopIndex;\n chain = chain.then(() =>\n Core.updateRowFragment(\n child,\n item,\n indexKey as string | null,\n itemIndex,\n itemArg ? String(itemArg) : null,\n newKey,\n ).then(() => {\n const referenceChild = insertTargets[currentInsertIndex] ?? null;\n return parent\n .insertBefore(child, referenceChild)\n .then(() => {\n insertTargets.splice(currentInsertIndex, 0, child);\n })\n .then(() => Core.initializeFreshEachRow(child));\n }),\n );\n }\n });\n return Promise.all(removalPromises)\n .then(() => chain)\n .then(() => {\n // eachupdateイベントを発火\n const validNewKeys = newKeys.filter(\n (key): key is string => key !== null,\n );\n const validSrcKeys = srcKeys.filter(\n (key): key is string => key !== null,\n );\n const validSrcKeySet = new Set(validSrcKeys);\n const addedKeys = validNewKeys.filter(key => !validSrcKeySet.has(key));\n const previousValidKeys = previousKeys.filter(\n (key): key is string => key !== null,\n );\n const removedKeys = previousValidKeys.filter(\n key => !newKeySet.has(key),\n );\n HaoriEvent.eachUpdate(\n parent.getTarget(),\n addedKeys,\n removedKeys,\n validNewKeys,\n );\n return undefined;\n });\n }\n\n /**\n * リスト比較用のキーを生成します。\n *\n * @param item 対象オブジェクト\n * @param keyArg リストキーに使用するプロパティ名\n * @param index 配列のインデックス\n * @returns リストキー\n */\n private static createListKey(\n item: Record<string, unknown> | string | number,\n keyArg: string | null,\n index: number,\n ): string {\n let listKey: string;\n if (typeof item === 'object' && item !== null) {\n if (keyArg) {\n const key = item[keyArg as string];\n if (key === null || key === undefined) {\n listKey = `__index_${index}`;\n } else if (typeof key == 'object') {\n listKey = JSON.stringify(key);\n } else {\n listKey = String(key);\n }\n } else {\n // data-each-key がない場合はインデックスをキーとして使用\n listKey = `__index_${index}`;\n }\n } else {\n listKey = String(item);\n }\n return listKey;\n }\n\n /**\n * 行フラグメントにデータを設定します。\n *\n * @param rowFragment 行フラグメント\n * @param data 行データ\n * @param indexKey インデックスキー\n * @param index インデックス番号\n * @param arg バインドデータパラメータ名\n * @param listKey リストキー\n * @returns 行メタデータの更新完了 Promise\n */\n private static updateRowFragment(\n rowFragment: ElementFragment,\n data: Record<string, unknown> | string | number,\n indexKey: string | null,\n index: number,\n arg: string | null,\n listKey: string,\n ): Promise<boolean> {\n let bindingData = data;\n if (typeof data === 'object' && data !== null) {\n bindingData = {...data};\n if (indexKey) {\n bindingData[indexKey] = index;\n }\n if (arg) {\n bindingData = {\n [arg]: bindingData,\n };\n }\n } else {\n if (arg) {\n bindingData = {\n [arg]: data,\n };\n if (indexKey) {\n bindingData[indexKey] = index;\n }\n } else {\n Log.error(\n '[Haori]',\n `Primitive value requires '${Env.prefix}each-arg' attribute: ${data}`,\n );\n return Promise.resolve(false);\n }\n }\n const normalizedBindingData = bindingData as Record<string, unknown>;\n const nextRenderSignature = Core.createBindingSignature({\n listKey,\n bindingData: normalizedBindingData,\n });\n if (\n rowFragment.getListKey() === listKey &&\n rowFragment.getRenderSignature() === nextRenderSignature\n ) {\n return Promise.resolve(false);\n }\n rowFragment.setListKey(listKey);\n rowFragment.setRenderSignature(nextRenderSignature);\n rowFragment.setBindingData(normalizedBindingData);\n return rowFragment\n .setAttribute(`${Env.prefix}row`, listKey)\n .then(() => true);\n }\n\n /**\n * 新規挿入行に遅延再評価が必要かどうかを判定します。\n *\n * @param fragment 判定対象の行フラグメント\n * @returns 遅延再評価が必要なら true\n */\n private static needsScheduledEvaluateAll(fragment: ElementFragment): boolean {\n const stack: ElementFragment[] = [fragment];\n while (stack.length > 0) {\n const current = stack.pop()!;\n current.getChildElementFragments().forEach(child => {\n stack.push(child);\n });\n if (\n current !== fragment &&\n !current.isMounted() &&\n Core.hasMountSensitiveAttribute(current)\n ) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * mounted 状態に依存して再評価が必要になりやすい属性を持つかどうかを返します。\n *\n * @param fragment 判定対象フラグメント\n * @returns 該当属性を持つなら true\n */\n private static hasMountSensitiveAttribute(\n fragment: ElementFragment,\n ): boolean {\n return ['fetch', 'import'].some(suffix =>\n fragment.hasAttribute(`${Env.prefix}${suffix}`),\n );\n }\n\n /**\n * バインド値が同一かどうかを再帰的に判定します。\n *\n * @param left 比較元の値\n * @param right 比較先の値\n * @param visited 循環参照対策用の訪問済みペア\n * @returns 同一なら true\n */\n private static createBindingSignature(\n value: unknown,\n seen: WeakMap<object, string> = new WeakMap(),\n nextId: {value: number} = {value: 0},\n ): string {\n if (value === null) {\n return 'null';\n }\n if (value === undefined) {\n return 'undefined';\n }\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n ) {\n return String(value);\n }\n if (typeof value === 'function') {\n return `[Function:${value.name || 'anonymous'}]`;\n }\n if (typeof value === 'symbol') {\n return value.toString();\n }\n if (value instanceof Date) {\n return `[Date:${value.toISOString()}]`;\n }\n if (Array.isArray(value)) {\n if (seen.has(value)) {\n return `[Circular:${seen.get(value)}]`;\n }\n const marker = `array-${nextId.value}`;\n nextId.value += 1;\n seen.set(value, marker);\n return `[${value\n .map(item => Core.createBindingSignature(item, seen, nextId))\n .join(',')}]`;\n }\n if (typeof value === 'object') {\n if (seen.has(value)) {\n return `[Circular:${seen.get(value)}]`;\n }\n const marker = `object-${nextId.value}`;\n nextId.value += 1;\n seen.set(value, marker);\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .sort()\n .map(\n key =>\n `${JSON.stringify(key)}:${Core.createBindingSignature(\n record[key],\n seen,\n nextId,\n )}`,\n )\n .join(',')}}`;\n }\n return String(value);\n }\n\n /**\n * フラグメントの再評価を次のイベントループで実行します。\n *\n * @param fragment 再評価対象のフラグメント\n */\n private static scheduleEvaluateAll(fragment: ElementFragment): void {\n setTimeout(() => {\n void Core.evaluateAll(fragment);\n }, 100);\n }\n}\n","/**\n * @fileoverview イベント振り分け機能\n *\n * クリック/変更/ロード/ポップステートイベントを検出し Procedure に委譲します。\n */\n\nimport Fragment, {ElementFragment} from './fragment';\nimport Procedure from './procedure';\nimport Log from './log';\n\n/**\n * イベントの振り分けを行うクラスです。\n */\nexport default class EventDispatcher {\n /** Haori が history.state に埋め込む状態キー */\n private static readonly HISTORY_STATE_KEY = '__haoriHistoryState__';\n\n /** ルート要素 */\n private readonly root: Document | HTMLElement;\n\n /** クリックデリゲータ */\n private readonly onClick = (event: Event) => this.delegate(event, 'click');\n\n /** 変更デリゲータ */\n private readonly onChange = (event: Event) => this.delegate(event, 'change');\n\n /** ロードデリゲータ(キャプチャで拾う) */\n private readonly onLoadCapture = (event: Event) =>\n this.delegate(event, 'load');\n\n /** ページ全体のロード完了時の処理 */\n private readonly onWindowLoad = () => {\n // ページロード時にも load を1回ディスパッチ\n const html = document.documentElement;\n const fragment = Fragment.get(html);\n if (fragment) {\n void new Procedure(fragment, 'load').run();\n }\n };\n\n /**\n * popstate デリゲータ(Haori が管理する履歴に戻った場合だけページをリロード)。\n *\n * @param event popstate イベント\n */\n private readonly onPopstate = (event: PopStateEvent) => {\n const state = event.state as Record<string, unknown> | null;\n if (!state || state[EventDispatcher.HISTORY_STATE_KEY] !== true) {\n return;\n }\n location.reload();\n };\n\n /**\n * コンストラクタ。\n *\n * @param root 監視対象のルート要素(デフォルトは document )\n */\n constructor(root: Document | HTMLElement = document) {\n this.root = root;\n }\n\n /**\n * イベントリスナーの登録を開始します。\n * クリック、変更、ロード、popstate イベントを監視し、対応するProcedureを実行します。\n */\n start(): void {\n this.root.addEventListener('click', this.onClick);\n this.root.addEventListener('change', this.onChange);\n // load は非バブルなのでキャプチャで拾う\n this.root.addEventListener('load', this.onLoadCapture, true);\n // ページ全体のロード\n window.addEventListener('load', this.onWindowLoad, {once: true});\n // ブラウザの戻る・進む操作\n window.addEventListener('popstate', this.onPopstate);\n }\n\n /**\n * イベントリスナーの登録を停止します。\n */\n stop(): void {\n this.root.removeEventListener('click', this.onClick);\n this.root.removeEventListener('change', this.onChange);\n this.root.removeEventListener('load', this.onLoadCapture, true);\n window.removeEventListener('load', this.onWindowLoad);\n window.removeEventListener('popstate', this.onPopstate);\n }\n\n /**\n * イベントを処理し、対応するProcedureを実行します。\n *\n * @param event 発生したイベント\n * @param type イベントタイプ('click', 'change', 'load'など)\n */\n private delegate(event: Event, type: string) {\n const element = this.getElementFromTarget(event.target, type);\n if (!element) {\n return;\n }\n const fragment = Fragment.get(element);\n if (!fragment) {\n return;\n }\n\n // changeイベントの場合、DOM値と同期\n if (type === 'change' && fragment instanceof ElementFragment) {\n fragment.syncValue();\n }\n\n new Procedure(fragment, type).run().catch(error => {\n Log.error('[Haori]', 'Procedure execution error:', error);\n });\n }\n\n /**\n * イベントのターゲットから HTMLElement を取得します。\n *\n * @param target イベントのターゲット\n * @param type イベントタイプ。click の場合のみ祖先委譲を行う\n * @returns HTMLElement または null\n */\n private getElementFromTarget(\n target: EventTarget | null,\n type: string | null,\n ): HTMLElement | null {\n if (!target) {\n return null;\n }\n if (target instanceof HTMLElement) {\n if (type === 'click') {\n return this.findClickableElement(target);\n }\n return target;\n }\n if (target instanceof Node) {\n const element = target.parentElement;\n if (!element) {\n return null;\n }\n if (type === 'click') {\n return this.findClickableElement(element);\n }\n return element;\n }\n return null;\n }\n\n /**\n * data-click-* 属性を持つ最も近い祖先要素を返します。\n *\n * @param element 探索開始要素\n * @returns 処理対象要素。見つからない場合は null\n */\n private findClickableElement(element: HTMLElement): HTMLElement | null {\n let current: HTMLElement | null = element;\n while (current) {\n if (\n current.getAttributeNames().some(name => name.startsWith('data-click-'))\n ) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n }\n}\n","/**\n * @fileoverview IntersectionObserver based trigger dispatcher.\n */\n\nimport Env from './env';\nimport Fragment, {ElementFragment} from './fragment';\nimport Log from './log';\nimport Procedure from './procedure';\n\ninterface IntersectRegistration {\n fragment: ElementFragment;\n observer: IntersectionObserver;\n once: boolean;\n running: boolean;\n}\n\n/**\n * `data-intersect-*` 属性を監視し、交差時に Procedure を実行します。\n */\nexport default class IntersectObserver {\n private static readonly CONFIG_KEYS = new Set([\n 'root',\n 'root-margin',\n 'threshold',\n 'disabled',\n 'once',\n ]);\n\n private static readonly registrations = new Map<\n HTMLElement,\n IntersectRegistration\n >();\n\n /**\n * ノードが現在の Window に属する HTMLElement かどうかを判定します。\n *\n * @param node 判定対象ノード\n * @returns HTMLElement の場合は true\n */\n private static isHtmlElement(node: unknown): node is HTMLElement {\n if (!(node instanceof Element)) {\n return false;\n }\n const ctor = node.ownerDocument?.defaultView?.HTMLElement;\n return typeof ctor !== 'undefined' && node instanceof ctor;\n }\n\n public static syncTree(root: Node): void {\n if (!(root instanceof Element || root instanceof DocumentFragment)) {\n return;\n }\n if (IntersectObserver.isHtmlElement(root)) {\n IntersectObserver.syncElement(root);\n }\n root.querySelectorAll<HTMLElement>('*').forEach(element => {\n IntersectObserver.syncElement(element);\n });\n }\n\n public static syncElement(element: HTMLElement): void {\n const registration = IntersectObserver.registrations.get(element);\n const fragment = Fragment.get(element);\n if (!fragment || !IntersectObserver.shouldObserve(fragment)) {\n if (registration) {\n registration.observer.disconnect();\n IntersectObserver.registrations.delete(element);\n }\n return;\n }\n\n if (typeof IntersectionObserver === 'undefined') {\n return;\n }\n\n const nextRoot = IntersectObserver.resolveRoot(fragment);\n const nextRootMargin = IntersectObserver.resolveRootMargin(fragment);\n const nextThreshold = IntersectObserver.resolveThreshold(fragment);\n const nextOnce = fragment.hasAttribute(`${Env.prefix}intersect-once`);\n\n if (\n registration &&\n registration.observer.root === nextRoot &&\n registration.observer.rootMargin === nextRootMargin &&\n IntersectObserver.sameThreshold(\n registration.observer.thresholds,\n nextThreshold,\n ) &&\n registration.once === nextOnce\n ) {\n registration.fragment = fragment;\n return;\n }\n\n if (registration) {\n registration.observer.disconnect();\n IntersectObserver.registrations.delete(element);\n }\n\n const observer = new IntersectionObserver(\n entries => {\n const current = IntersectObserver.registrations.get(element);\n if (!current) {\n return;\n }\n entries.forEach(entry => {\n if (!entry.isIntersecting || current.running) {\n return;\n }\n if (IntersectObserver.isDisabled(current.fragment)) {\n return;\n }\n current.running = true;\n void new Procedure(current.fragment, 'intersect')\n .runWithResult()\n .then(success => {\n if (success && current.once) {\n current.observer.disconnect();\n IntersectObserver.registrations.delete(element);\n }\n })\n .catch(error => {\n Log.error(\n '[Haori]',\n 'Intersect procedure execution error:',\n error,\n );\n })\n .finally(() => {\n const latest = IntersectObserver.registrations.get(element);\n if (latest) {\n latest.running = false;\n }\n });\n });\n },\n {\n root: nextRoot,\n rootMargin: nextRootMargin,\n threshold: nextThreshold,\n },\n );\n\n observer.observe(element);\n IntersectObserver.registrations.set(element, {\n fragment,\n observer,\n once: nextOnce,\n running: false,\n });\n }\n\n public static cleanupTree(root: Node): void {\n if (IntersectObserver.isHtmlElement(root)) {\n const registration = IntersectObserver.registrations.get(root);\n if (registration) {\n registration.observer.disconnect();\n IntersectObserver.registrations.delete(root);\n }\n }\n if (!(root instanceof Element || root instanceof DocumentFragment)) {\n return;\n }\n root.querySelectorAll<HTMLElement>('*').forEach(element => {\n const registration = IntersectObserver.registrations.get(element);\n if (registration) {\n registration.observer.disconnect();\n IntersectObserver.registrations.delete(element);\n }\n });\n }\n\n public static disconnectAll(): void {\n IntersectObserver.registrations.forEach(registration => {\n registration.observer.disconnect();\n });\n IntersectObserver.registrations.clear();\n }\n\n private static shouldObserve(fragment: ElementFragment): boolean {\n return fragment.getAttributeNames().some(name => {\n if (!name.startsWith(`${Env.prefix}intersect-`)) {\n return false;\n }\n const key = name.slice(`${Env.prefix}intersect-`.length);\n return !IntersectObserver.CONFIG_KEYS.has(key);\n });\n }\n\n private static resolveRoot(fragment: ElementFragment): HTMLElement | null {\n const attrName = `${Env.prefix}intersect-root`;\n if (!fragment.hasAttribute(attrName)) {\n return null;\n }\n const selector = fragment.getAttribute(attrName);\n if (typeof selector !== 'string' || selector.trim() === '') {\n return null;\n }\n const root = document.querySelector(selector);\n if (IntersectObserver.isHtmlElement(root)) {\n return root;\n }\n Log.error('[Haori]', `Intersect root element not found: ${selector}`);\n return null;\n }\n\n private static resolveRootMargin(fragment: ElementFragment): string {\n const attrName = `${Env.prefix}intersect-root-margin`;\n const value = fragment.getAttribute(attrName);\n if (value === null || value === false || value === '') {\n return '0px';\n }\n return String(value);\n }\n\n private static resolveThreshold(fragment: ElementFragment): number {\n const attrName = `${Env.prefix}intersect-threshold`;\n const value = fragment.getAttribute(attrName);\n const threshold =\n typeof value === 'number' ? value : Number.parseFloat(String(value ?? 0));\n if (Number.isNaN(threshold)) {\n return 0;\n }\n return Math.min(1, Math.max(0, threshold));\n }\n\n private static isDisabled(fragment: ElementFragment): boolean {\n const attrName = `${Env.prefix}intersect-disabled`;\n const value = fragment.getAttribute(attrName);\n if (value === null || value === false) {\n return false;\n }\n if (typeof value === 'boolean') {\n return value;\n }\n const stringValue = String(value).trim().toLowerCase();\n return stringValue !== '' && stringValue !== 'false' && stringValue !== '0';\n }\n\n private static sameThreshold(\n thresholds: readonly number[],\n threshold: number,\n ): boolean {\n return thresholds.length === 1 && thresholds[0] === threshold;\n }\n}\n","/**\n * @fileoverview 監視機能\n *\n * Observerクラスは、DOMの変更を監視し、バインディングの更新を行います。\n * MutationObserverを使用して、属性の変更、ノードの追加・削除、テキストノードの変更を監視します。\n */\nimport Core from './core';\nimport EventDispatcher from './event_dispatcher';\nimport IntersectObserver from './intersect';\nimport Log from './log';\nimport Queue from './queue';\n\n/**\n * 監視対象の要素を管理するためのクラスです。\n */\nexport class Observer {\n private static _initialized = false;\n\n /** 稼働中の MutationObserver 一覧 */\n private static readonly _mutationObservers: MutationObserver[] = [];\n\n /**\n * 既存の MutationObserver をすべて停止します。\n */\n private static disconnectMutationObservers(): void {\n Observer._mutationObservers.forEach(observer => {\n observer.disconnect();\n });\n Observer._mutationObservers.length = 0;\n }\n\n /**\n * 初期化メソッド。\n * ドキュメントのheadとbodyを監視対象として設定します。\n */\n public static async init() {\n if (Observer._initialized) {\n return;\n }\n Observer._initialized = true;\n Observer.disconnectMutationObservers();\n const results = await Promise.allSettled([\n Core.scan(document.head),\n Core.scan(document.body),\n ]);\n const [headResult, bodyResult] = results;\n if (headResult.status !== 'fulfilled') {\n Log.error('[Haori]', 'Failed to build head fragment:', headResult.reason);\n }\n if (bodyResult.status !== 'fulfilled') {\n Log.error('[Haori]', 'Failed to build body fragment:', bodyResult.reason);\n }\n await Queue.wait();\n document.body.setAttribute('data-haori-ready', '');\n Observer.observe(document.head);\n Observer.observe(document.body);\n new EventDispatcher().start();\n IntersectObserver.syncTree(document.body);\n }\n\n /**\n * 指定された要素を監視します。\n *\n * @param root 監視対象の要素\n */\n public static observe(root: HTMLElement | Document) {\n const observer = new MutationObserver(async mutations => {\n for (const mutation of mutations) {\n try {\n switch (mutation.type) {\n case 'attributes': {\n const element = mutation.target as HTMLElement;\n if (\n mutation.attributeName &&\n element.hasAttribute('data-haori-click-lock') &&\n (mutation.attributeName === 'disabled' ||\n mutation.attributeName === 'data-haori-click-lock')\n ) {\n break;\n }\n if (\n mutation.attributeName &&\n Core.isAliasedAttributeReflection(\n element,\n mutation.attributeName,\n )\n ) {\n break;\n }\n Core.setAttribute(\n element,\n mutation.attributeName!,\n element.getAttribute(mutation.attributeName!),\n true,\n );\n IntersectObserver.syncElement(element);\n break;\n }\n case 'childList': {\n Array.from(mutation.removedNodes).forEach(node => {\n IntersectObserver.cleanupTree(node);\n Core.removeNode(node);\n });\n Array.from(mutation.addedNodes).forEach(node => {\n if (!(node.parentElement instanceof Element)) {\n return;\n }\n Core.addNode(node.parentElement, node);\n IntersectObserver.syncTree(node);\n });\n break;\n }\n case 'characterData': {\n if (\n mutation.target instanceof Text ||\n mutation.target instanceof Comment\n ) {\n Core.changeText(mutation.target, mutation.target.textContent!);\n } else {\n Log.warn(\n '[Haori]',\n 'Unsupported character data type:',\n mutation.target,\n );\n }\n break;\n }\n default:\n Log.warn('[Haori]', 'Unknown mutation type:', mutation.type);\n continue;\n }\n } catch (error) {\n Log.error('[Haori]', 'Error processing mutation:', error);\n }\n }\n });\n\n observer.observe(root, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n });\n Observer._mutationObservers.push(observer);\n }\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', Observer.init);\n} else {\n Observer.init();\n}\n","/**\n * @fileoverview Haori-js メインエントリーポイント\n *\n * Haori-jsライブラリのすべての機能を提供するメインファイルです。\n */\n\nimport Core from './core';\nimport Env from './env';\nimport Fragment from './fragment';\nimport Form from './form';\nimport Haori from './haori';\nimport Log from './log';\nimport Queue from './queue';\n// ブラウザ運用時の監視・自動起動(本番動作)は observer モジュールが担います\nimport './observer';\n\n// メインクラスとユーティリティをエクスポート\nexport {Core, Env, Fragment, Form, Haori, Log, Queue};\nexport type {HaoriRuntime} from './env';\n\n// デフォルトエクスポート(Haoriをメインとして提供)\nexport default Haori;\n\n// バージョン情報\nexport const version = '0.4.13';\n"],"names":["_Dev","enabled","Dev","DEFAULT_RUNTIME","isHaoriRuntime","runtime","resolveRuntimeAttribute","_Env","currentScript","prefix","host","Env","Log","message","args","_Expression","scope","candidates","value","bindKeys","bindKeySet","name","expression","bindedValues","forbiddenBindingValues","runtimeBindings","allowMissingIdentifierRecovery","recoveryCount","setup","argValues","wrappedValues","key","error","missingIdentifier","cacheKey","evaluator","assignments","body","identifier","pattern","tokens","groups","previous","index","token","next","activeGroup","beforePrevious","thirdPrevious","group","operators","singleCharacters","current","stringToken","operator","item","numberToken","identifierToken","start","quote","literal","_","code","escaped","cache","target","cachedValue","proxy","currentTarget","property","receiver","result","thisArg","argArray","newTarget","prototype","callback","originals","descriptor","obj","seen","cached","Expression","AsyncQueue","task","prepend","resolve","reject","promise","res","rej","promises","_Queue","Queue","Haori","level","toast","element","recipient","parent","FORM_HAORI_METHOD_NAMES","resolveFormHaoriApi","candidate","methodName","Form","form","values","fragment","objectName","listName","child","childValues","childList","force","emitEvents","detach","children","i","Core","tasks","removeClones","f","isBefore","isAfter","processChildren","activeHaori","addMsgFn","doAdd","targetFragments","targetFragment","parts","results","firstPoint","lastPoint","rawKey","indexString","rows","_EvaluationProfileRegistry","elementId","store","counter","left","right","childIndex","leftCalls","sum","context","expressions","totalDurationMs","globalRecord","existing","counters","template","placeholders","placeholder","startedAt","segments","segment","rawId","deriveName","EvaluationProfileRegistry","_Fragment","node","ElementFragment","TextFragment","CommentFragment","prevSkip","mounted","unmount","Fragment","_ElementFragment","contents","AttributeContents","childFragment","clone","childClone","data","signature","skippable","dispatchEvents","isBooleanCheckbox","newChecked","fromObserver","rawName","targetName","syncValueProperty","detail","hasTemplateExpression","isBooleanAttribute","isSingleExpression","joinedValue","TextContents","evaluatedValue","shouldRemoveTarget","shouldSyncValueProperty","stringResult","requiresRawAttributeWrite","requiresTargetAttributeWrite","requiresValuePropertyWrite","referenceChild","insertAfter","referenceNode","insertionReferenceNode","nextTrackedNode","newChild","referenceNodeOverride","ancestors","ancestor","isSameParent","newChildIndex","referenceIndex","newChildParent","insertionPoint","siblings","text","nextText","currentText","_TextContents","matches","lastIndex","hasEvaluate","hasRawEvaluate","match","content","c","bindingValues","profileContext","shouldEvaluate","errorKind","profileExpressions","hasUnresolvedReference","measured","_AttributeContents","HaoriEvent","eventName","options","event","version","url","bytes","reason","changedKeys","prevKeys","nextKeys","allKeys","prevValue","nextValue","added","removed","order","from","to","payload","metadata","status","PROCEDURE_HAORI_METHOD_NAMES","PROCEDURE_HISTORY_STATE_KEY","PROCEDURE_CLICK_LOCK_MARKER","resolveProcedureHaoriApi","QUERY_TRANSPORT_METHODS","isQueryTransportMethod","method","appendPayloadToSearchParams","params","appendPayloadToUrl","fetchUrl","normalizeRequestBody","buildFetchSignature","headers","normalizedHeaders","a","b","_Procedure","hasFetchFallback","rawAttribute","_matched","rawExpression","source","offset","inString","char","attrName","attributeEvaluation","dataAttribute","trimmed","resolved","formSelector","formElement","e","fetchAttrName","hasFetchAttr","fetchEvaluation","fetchOptions","fetchMethodAttrEvent","fetchMethodEvaluation","fetchMethodAttrNonEvent","fetchHeadersAttrEvent","headersString","fetchHeadersAttrNonEvent","fetchCTAttrEvent","fetchContentTypeEvaluation","hasContentType","fetchCTAttrNonEvent","bindAttr","bindSelector","bindElements","bindArgAttrEvent","bindArgAttrNonEventLegacy","bindArgAttrNonEventNew","bindParamsAttr","paramsString","p","bindAppendAttr","copyParamsAttr","param","adjustSelector","adjustElements","valueString","rawLevel","isValidLevel","historyFormSelector","historyFormElement","attrKey","selector","list","el","frag","copySourceAttrName","arg1","arg2","executionLock","preparedRequest","hasPayload","finalOptions","requestedMethod","isDemoQueryNormalization","queryString","fetchStartMetadata","response","formFragment","skipFragments","bindingData","merged","deferredPromises","hasHistoryUrl","historyDataValues","historyFormValues","hasHistoryData","hasHistoryForm","baseUrlString","errorMessage","appendParams","k","v","baseFragment","addGeneralMessage","targetEl","scrollToFirstError","root","entries","m","firstInvalid","found","newData","bindArg","currentValue","currentObject","resolvedData","currentData","incoming","sourceData","copyData","payloadResolution","contentType","formData","includeParams","excludeParams","trimmedParam","excludedParam","filtered","adjustValue","rowFragment","newFragment","prevFragment","nextFragment","Procedure","Url","Import","init","doc","_Core","suffix","aliasPrefix","chain","rawValue","state","importEvaluation","resolvedUrl","html","childPromises","stopAtEach","attributeChain","processedAttributes","condition","aliasedAttributeName","deriveChangedPromise","nextDeriveInputSignature","arg","changed","formValues","parentElement","hasDerive","hasIf","hasEach","deriveExpression","shouldSkipDerivedSubtree","shouldRecordDerivedSubtreeSignature","nextDerivedSubtreeSignature","previousDerivedBindingData","normalizedName","nextDerivedBindingData","keyArg","nextEachInputSignature","templateTarget","evaluation","profile","siblingIndex","allowedEachAttributes","hasDynamicAttributes","hasDynamicChildren","newList","indexKey","itemArg","keyDataMap","newKeys","itemIndex","listKey","newKeySet","removalPromises","childElements","previousKeys","srcKeys","childElementsByKey","insertTargets","baseInsertIndex","newKey","loopIndex","reusedChild","currentInsertIndex","validNewKeys","validSrcKeys","validSrcKeySet","addedKeys","removedKeys","normalizedBindingData","nextRenderSignature","stack","nextId","marker","record","_EventDispatcher","type","EventDispatcher","_IntersectObserver","ctor","registration","nextRoot","nextRootMargin","nextThreshold","nextOnce","observer","entry","success","latest","threshold","stringValue","thresholds","IntersectObserver","_Observer","headResult","bodyResult","mutations","mutation","Observer"],"mappings":"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"}
|