formfx 1.0.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/LICENSE +28 -0
- package/README.ja.md +171 -0
- package/README.md +171 -0
- package/dist/chunk-6E5EWQVW.js +62 -0
- package/dist/chunk-6E5EWQVW.js.map +1 -0
- package/dist/chunk-GXMPHKTF.cjs +62 -0
- package/dist/chunk-GXMPHKTF.cjs.map +1 -0
- package/dist/editor.cjs +2 -0
- package/dist/editor.cjs.map +1 -0
- package/dist/editor.d.cts +141 -0
- package/dist/editor.d.ts +141 -0
- package/dist/editor.js +2 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.cjs +138 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +138 -0
- package/dist/index.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/dom/value.ts","../src/internal/dom/effects.ts","../src/internal/dom/select.ts","../src/internal/expr/evaluator.ts","../src/internal/expr/parser.ts","../src/internal/expr/tokenizer.ts","../src/internal/engine.ts","../src/internal/observe.ts","../src/plugins/repeater/index.ts","../src/internal/debug/panel.ts","../src/core/FormFx.ts"],"names":["getInputValue","el","checked","clearValue","input","setDisabled","disabled","applyShow","show","options","isCurrentlyVisible","applyRequired","required","applyDisabled","applyClear","findById","root","id","byName","evaluate","node","context","fieldName","left","right","func","args","arg","parse","tokens","current","walk","parseLogicalOr","parseLogicalAnd","operator","parseComparison","parseAdditive","comparisonOps","parseMultiplicative","parseUnary","parsePrimary","token","elements","tokenize","char","isRow","value","rowPrefix","idMatch","word","createRules","formElement","rules","type","attrName","expression","ast","e","jsonRule","addEffectRules","effects","isElse","effect","key","selector","finalAst","getDependencies","global","row","traverse","BUILTIN_FUNCTIONS","val","list","sub","runRules","debugInfos","globalContext","allGlobalDeps","rule","baseEvalContext","elementToTypeToSource","rowContext","rowItem","fieldEl","evalContext","boolResult","errorMsg","setupEventListener","callback","dependentIds","handler","setupMutationObserver","observer","mutations","shouldUpdate","mutation","setupRepeaters","onUpdate","repeaterElements","cleanups","container","config","handleAdd","addItem","reindex","handleListClick","target","item","c","items","index","field","DebugPanel","saved","state","header","info","listEl","result","error","statusClass","statusText","effectInfo","FormFx","RuleEditor","persist","data","ruleId"],"mappings":"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","file":"index.cjs","sourcesContent":["import { FXValue } from '../../types';\r\n\r\nexport function getInputValue(el: HTMLElement): FXValue {\r\n if (el instanceof HTMLInputElement) {\r\n if (el.type === 'checkbox') {\r\n return el.checked;\r\n }\r\n if (el.type === 'radio') {\r\n // ラジオボタンの場合は、同じnameを持つチェックされている要素を探す\r\n if (el.name) {\r\n const form = el.closest('form') || document;\r\n const checked = form.querySelector(`input[name=\"${el.name}\"]:checked`) as HTMLInputElement;\r\n return checked ? checked.value : null;\r\n }\r\n return el.checked ? el.value : null;\r\n }\r\n if (el.type === 'number' || el.type === 'range') {\r\n return el.value === '' ? null : Number(el.value);\r\n }\r\n return el.value;\r\n }\r\n \r\n if (el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) {\r\n return el.value;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function clearValue(el: HTMLElement): void {\r\n if (el instanceof HTMLInputElement) {\r\n if (el.type === 'checkbox' || el.type === 'radio') {\r\n el.checked = false;\r\n } else {\r\n el.value = '';\r\n }\r\n } else if (el instanceof HTMLSelectElement) {\r\n el.selectedIndex = -1;\r\n el.value = '';\r\n } else if (el instanceof HTMLTextAreaElement) {\r\n el.value = '';\r\n } else {\r\n // コンテナの場合は配下の要素をクリア\r\n const inputs = el.querySelectorAll('input, select, textarea');\r\n inputs.forEach(input => clearValue(input as HTMLElement));\r\n }\r\n}\r\n\r\nexport function setDisabled(el: HTMLElement, disabled: boolean): void {\r\n if ('disabled' in el) {\r\n (el as any).disabled = disabled;\r\n } else {\r\n // コンテナの場合は配下の要素を制御\r\n const inputs = el.querySelectorAll('input, select, textarea');\r\n inputs.forEach(input => {\r\n (input as HTMLInputElement).disabled = disabled;\r\n });\r\n }\r\n}\r\n","import { FormFxOptions } from '../../types';\r\nimport { clearValue, setDisabled } from './value';\r\n\r\nexport function applyShow(el: HTMLElement, show: boolean, options: FormFxOptions): void {\r\n const isCurrentlyVisible = el.style.display !== 'none';\r\n \r\n if (show) {\r\n el.style.display = el.dataset.fxOriginalDisplay || '';\r\n // 再表示されたときに disabled を解除するかどうかは要件にないが、\r\n // disableOnHide=true の場合は対称性を持たせるのが一般的\r\n if (options.disableOnHide && !isCurrentlyVisible) {\r\n setDisabled(el, false);\r\n }\r\n } else {\r\n if (isCurrentlyVisible && !el.dataset.fxOriginalDisplay) {\r\n el.dataset.fxOriginalDisplay = el.style.display;\r\n }\r\n el.style.display = 'none';\r\n \r\n // 非表示になったときの追加処理\r\n if (isCurrentlyVisible) {\r\n if (el.dataset.fxClearOnHide === 'true' || options.clearOnHide) {\r\n clearValue(el);\r\n }\r\n if (options.disableOnHide) {\r\n setDisabled(el, true);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function applyRequired(el: HTMLElement, required: boolean): void {\r\n if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) {\r\n el.required = required;\r\n } else {\r\n // コンテナの場合、配下の全ての入力要素に適用\r\n const inputs = el.querySelectorAll('input, select, textarea');\r\n inputs.forEach(input => {\r\n (input as HTMLInputElement).required = required;\r\n });\r\n }\r\n}\r\n\r\nexport function applyDisabled(el: HTMLElement, disabled: boolean): void {\r\n setDisabled(el, disabled);\r\n}\r\n\r\nexport function applyClear(el: HTMLElement): void {\r\n clearValue(el);\r\n}\r\n","export function findById(root: HTMLElement, id: string): HTMLElement | null {\r\n // 1. Try to find by ID\r\n const el = root.querySelector(`#${id.replace(/([#;?%&,.+*~\\':\"!^$[\\]()=>|/@])/g, '\\\\$1')}`);\r\n if (el) return el as HTMLElement;\r\n\r\n // 2. Try to find by name attribute (v1.0 enhancement)\r\n const byName = root.querySelector(`[name=\"${id}\"]`);\r\n if (byName) return byName as HTMLElement;\r\n \r\n // 3. Try to find by data-fx-id\r\n return root.querySelector(`[data-fx-id=\"${id}\"]`) as HTMLElement | null;\r\n}\r\n\r\nexport function findByFxAttr(root: HTMLElement, attr: string): HTMLElement[] {\r\n return Array.from(root.querySelectorAll(`[${attr}]`));\r\n}\r\n","import { ASTNode, FXValue, EvaluationContext } from '../../types';\r\n\r\nexport function evaluate(node: ASTNode, context: EvaluationContext): FXValue {\r\n switch (node.type) {\r\n case 'Literal':\r\n return node.value;\r\n\r\n case 'Identifier': {\r\n if (node.name.startsWith('@row.')) {\r\n const fieldName = node.name.substring(5);\r\n return context.row && context.row[fieldName] !== undefined ? context.row[fieldName] : null;\r\n }\r\n return context.global[node.name] !== undefined ? context.global[node.name] : null;\r\n }\r\n\r\n case 'UnaryExpression':\r\n if (node.operator === '!') {\r\n return !evaluate(node.argument, context);\r\n }\r\n throw new Error(`Unknown unary operator: ${(node as any).operator}`);\r\n\r\n case 'BinaryExpression': {\r\n const left = evaluate(node.left, context);\r\n const right = evaluate(node.right, context);\r\n if (node.operator === '==') return left == right;\r\n if (node.operator === '!=') return left != right;\r\n if (node.operator === '>') return (left as any) > (right as any);\r\n if (node.operator === '>=') return (left as any) >= (right as any);\r\n if (node.operator === '<') return (left as any) < (right as any);\r\n if (node.operator === '<=') return (left as any) <= (right as any);\r\n if (node.operator === '+') return (left as any) + (right as any);\r\n if (node.operator === '-') return (left as any) - (right as any);\r\n if (node.operator === '*') return (left as any) * (right as any);\r\n if (node.operator === '/') return (left as any) / (right as any);\r\n if (node.operator === '%') return (left as any) % (right as any);\r\n throw new Error(`Unknown binary operator: ${node.operator}`);\r\n }\r\n\r\n case 'LogicalExpression': {\r\n const left = evaluate(node.left, context);\r\n if (node.operator === '&&') {\r\n return left && evaluate(node.right, context);\r\n }\r\n if (node.operator === '||') {\r\n return left || evaluate(node.right, context);\r\n }\r\n throw new Error(`Unknown logical operator: ${node.operator}`);\r\n }\r\n\r\n case 'CallExpression': {\r\n const func = context.functions[node.callee];\r\n if (!func) {\r\n throw new Error(`Unknown function: ${node.callee}`);\r\n }\r\n const args = node.arguments.map((arg: ASTNode) => evaluate(arg, context));\r\n return func(...args);\r\n }\r\n\r\n case 'ArrayExpression': {\r\n return node.elements.map((el: ASTNode) => evaluate(el, context));\r\n }\r\n\r\n default:\r\n throw new Error(`Unknown AST node type: ${(node as any).type}`);\r\n }\r\n}\r\n","import { ASTNode, Token } from '../../types';\r\n\r\n/**\r\n * 簡易的な再帰下降構文解析器\r\n * 優先順位:\r\n * 1. Primary (Identifier, Literal, Parentheses)\r\n * 2. Unary (!)\r\n * 3. Comparison (==, !=)\r\n * 4. Logical AND (&&)\r\n * 5. Logical OR (||)\r\n */\r\nexport function parse(tokens: Token[]): ASTNode {\r\n let current = 0;\r\n\r\n function walk(): ASTNode {\r\n return parseLogicalOr();\r\n }\r\n\r\n function parseLogicalOr(): ASTNode {\r\n let node = parseLogicalAnd();\r\n while (current < tokens.length && tokens[current].value === '||') {\r\n const operator = tokens[current].value as '||';\r\n current++;\r\n const right = parseLogicalAnd();\r\n node = { type: 'LogicalExpression', operator, left: node, right };\r\n }\r\n return node;\r\n }\r\n\r\n function parseLogicalAnd(): ASTNode {\r\n let node = parseComparison();\r\n while (current < tokens.length && tokens[current].value === '&&') {\r\n const operator = tokens[current].value as '&&';\r\n current++;\r\n const right = parseComparison();\r\n node = { type: 'LogicalExpression', operator, left: node, right };\r\n }\r\n return node;\r\n }\r\n\r\n function parseComparison(): ASTNode {\r\n let node = parseAdditive();\r\n const comparisonOps = ['==', '!=', '>', '>=', '<', '<='];\r\n while (current < tokens.length && comparisonOps.includes(tokens[current].value)) {\r\n const operator = tokens[current].value;\r\n current++;\r\n const right = parseAdditive();\r\n node = { type: 'BinaryExpression', operator, left: node, right };\r\n }\r\n return node;\r\n }\r\n\r\n function parseAdditive(): ASTNode {\r\n let node = parseMultiplicative();\r\n while (current < tokens.length && (tokens[current].value === '+' || tokens[current].value === '-')) {\r\n const operator = tokens[current].value;\r\n current++;\r\n const right = parseMultiplicative();\r\n node = { type: 'BinaryExpression', operator, left: node, right };\r\n }\r\n return node;\r\n }\r\n\r\n function parseMultiplicative(): ASTNode {\r\n let node = parseUnary();\r\n while (current < tokens.length && (tokens[current].value === '*' || tokens[current].value === '/' || tokens[current].value === '%')) {\r\n const operator = tokens[current].value;\r\n current++;\r\n const right = parseUnary();\r\n node = { type: 'BinaryExpression', operator, left: node, right };\r\n }\r\n return node;\r\n }\r\n\r\n function parseUnary(): ASTNode {\r\n if (current < tokens.length && tokens[current].value === '!') {\r\n current++;\r\n return { type: 'UnaryExpression', operator: '!', argument: parseUnary() };\r\n }\r\n return parsePrimary();\r\n }\r\n\r\n function parsePrimary(): ASTNode {\r\n const token = tokens[current];\r\n\r\n if (token.type === 'PAREN' && token.value === '(') {\r\n current++;\r\n const node = walk();\r\n if (tokens[current]?.value !== ')') {\r\n throw new Error('Expected )');\r\n }\r\n current++;\r\n return node;\r\n }\r\n\r\n if (token.type === 'IDENTIFIER') {\r\n current++;\r\n // 関数呼び出しのチェック: id(arg1, arg2)\r\n if (current < tokens.length && tokens[current].type === 'PAREN' && tokens[current].value === '(') {\r\n current++; // skip (\r\n const args: ASTNode[] = [];\r\n if (!(tokens[current].type === 'PAREN' && tokens[current].value === ')')) {\r\n while (true) {\r\n args.push(walk());\r\n if (tokens[current].type === 'COMMA') {\r\n current++;\r\n continue;\r\n }\r\n if (tokens[current].type === 'PAREN' && tokens[current].value === ')') {\r\n break;\r\n }\r\n throw new Error(`Expected , or ) in function call \"${token.value}\"`);\r\n }\r\n }\r\n current++; // skip )\r\n return { type: 'CallExpression', callee: token.value, arguments: args };\r\n }\r\n return { type: 'Identifier', name: token.value };\r\n }\r\n\r\n if (token.type === 'BRACKET' && token.value === '[') {\r\n current++; // skip [\r\n const elements: ASTNode[] = [];\r\n if (!(tokens[current].type === 'BRACKET' && tokens[current].value === ']')) {\r\n while (true) {\r\n elements.push(walk());\r\n if (tokens[current].type === 'COMMA') {\r\n current++;\r\n continue;\r\n }\r\n if (tokens[current].type === 'BRACKET' && tokens[current].value === ']') {\r\n break;\r\n }\r\n throw new Error('Expected , or ] in array literal');\r\n }\r\n }\r\n current++; // skip ]\r\n return { type: 'ArrayExpression', elements };\r\n }\r\n\r\n if (token.type === 'NUMBER') {\r\n current++;\r\n return { type: 'Literal', value: parseFloat(token.value) };\r\n }\r\n\r\n if (token.type === 'STRING') {\r\n current++;\r\n return { type: 'Literal', value: token.value };\r\n }\r\n\r\n if (token.type === 'BOOLEAN') {\r\n current++;\r\n return { type: 'Literal', value: token.value === 'true' };\r\n }\r\n\r\n throw new Error(`Unexpected token: ${token.value}`);\r\n }\r\n\r\n return walk();\r\n}\r\n","import { Token } from '../../types';\r\n\r\nexport function tokenize(input: string): Token[] {\r\n const tokens: Token[] = [];\r\n let current = 0;\r\n\r\n while (current < input.length) {\r\n let char = input[current];\r\n\r\n if (/\\s/.test(char)) {\r\n current++;\r\n continue;\r\n }\r\n\r\n if (char === '(' || char === ')') {\r\n tokens.push({ type: 'PAREN', value: char });\r\n current++;\r\n continue;\r\n }\r\n\r\n if (char === '[' || char === ']') {\r\n tokens.push({ type: 'BRACKET', value: char });\r\n current++;\r\n continue;\r\n }\r\n\r\n if (char === ',') {\r\n tokens.push({ type: 'COMMA', value: char });\r\n current++;\r\n continue;\r\n }\r\n\r\n if (char === '#' || char === '@') {\r\n const isRow = char === '@';\r\n let value = isRow ? '@' : '';\r\n current++; // skip # or @\r\n \r\n // @row.fieldName 対応\r\n if (isRow) {\r\n let rowPrefix = '';\r\n while (current < input.length && /[a-zA-Z0-9_-]/.test(input[current])) {\r\n rowPrefix += input[current];\r\n current++;\r\n }\r\n value += rowPrefix;\r\n if (input[current] === '.') {\r\n value += '.';\r\n current++;\r\n while (current < input.length && /[a-zA-Z0-9_-]/.test(input[current])) {\r\n value += input[current];\r\n current++;\r\n }\r\n }\r\n } else {\r\n while (current < input.length && /[a-zA-Z0-9_-]/.test(input[current])) {\r\n value += input[current];\r\n current++;\r\n }\r\n }\r\n tokens.push({ type: 'IDENTIFIER', value });\r\n continue;\r\n }\r\n\r\n if (/[0-9]/.test(char)) {\r\n let value = '';\r\n while (current < input.length && /[0-9.]/.test(input[current])) {\r\n value += input[current];\r\n current++;\r\n }\r\n tokens.push({ type: 'NUMBER', value });\r\n continue;\r\n }\r\n\r\n if (char === \"'\") {\r\n let value = '';\r\n current++; // skip '\r\n while (current < input.length && input[current] !== \"'\") {\r\n value += input[current];\r\n current++;\r\n }\r\n current++; // skip '\r\n tokens.push({ type: 'STRING', value });\r\n continue;\r\n }\r\n\r\n // Operators: ==, !=, &&, ||, !, >=, <=, >, <\r\n if (char === '=' && input[current + 1] === '=') {\r\n tokens.push({ type: 'OPERATOR', value: '==' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '!' && input[current + 1] === '=') {\r\n tokens.push({ type: 'OPERATOR', value: '!=' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '>' && input[current + 1] === '=') {\r\n tokens.push({ type: 'OPERATOR', value: '>=' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '<' && input[current + 1] === '=') {\r\n tokens.push({ type: 'OPERATOR', value: '<=' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '>') {\r\n tokens.push({ type: 'OPERATOR', value: '>' });\r\n current++;\r\n continue;\r\n }\r\n if (char === '<') {\r\n tokens.push({ type: 'OPERATOR', value: '<' });\r\n current++;\r\n continue;\r\n }\r\n if (char === '&' && input[current + 1] === '&') {\r\n tokens.push({ type: 'OPERATOR', value: '&&' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '|' && input[current + 1] === '|') {\r\n tokens.push({ type: 'OPERATOR', value: '||' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '!') {\r\n tokens.push({ type: 'OPERATOR', value: '!' });\r\n current++;\r\n continue;\r\n }\r\n\r\n if (char === '+' || char === '-' || char === '*' || char === '/' || char === '%') {\r\n tokens.push({ type: 'OPERATOR', value: char });\r\n current++;\r\n continue;\r\n }\r\n\r\n // Identifiers (for functions like in, contains)\r\n const idMatch = input.slice(current).match(/^[a-zA-Z][a-zA-Z0-9_]*/);\r\n if (idMatch) {\r\n // boolean check already exists below, so we handle it here or let it fall through\r\n const word = idMatch[0];\r\n if (word === 'true' || word === 'false') {\r\n tokens.push({ type: 'BOOLEAN', value: word });\r\n current += word.length;\r\n } else {\r\n tokens.push({ type: 'IDENTIFIER', value: word });\r\n current += word.length;\r\n }\r\n continue;\r\n }\r\n\r\n throw new Error(`Unexpected character: ${char} at position ${current}`);\r\n }\r\n\r\n return tokens;\r\n}\r\n","import { ASTNode, DebugInfo, EffectType, EvaluationContext, FormFxOptions, FXValue, JSONEffect, JSONRule, Rule } from '../types';\r\nimport { applyClear, applyDisabled, applyRequired, applyShow } from './dom/effects';\r\nimport { findById } from './dom/select';\r\nimport { getInputValue } from './dom/value';\r\nimport { evaluate } from './expr/evaluator';\r\nimport { parse } from './expr/parser';\r\nimport { tokenize } from './expr/tokenizer';\r\n\r\nexport function createRules(formElement: HTMLElement, options: FormFxOptions = {}): Rule[] {\r\n const rules: Rule[] = [];\r\n \r\n // 1. attributes ルール\r\n const attributeTypes: EffectType[] = ['show', 'required', 'disabled', 'enable', 'clear'];\r\n\r\n attributeTypes.forEach(type => {\r\n const attrName = `data-fx-${type}`;\r\n const elements = formElement.querySelectorAll<HTMLElement>(`[${attrName}]`);\r\n \r\n elements.forEach(el => {\r\n const expression = el.getAttribute(attrName) || '';\r\n try {\r\n const tokens = tokenize(expression);\r\n const ast = parse(tokens);\r\n rules.push({\r\n element: el,\r\n type,\r\n expression,\r\n ast,\r\n source: 'attribute'\r\n });\r\n } catch (e) {\r\n console.warn(`[FormFx] Failed to parse expression \"${expression}\" for ${attrName}:`, e);\r\n }\r\n });\r\n });\r\n\r\n // 2. JSON rules\r\n if (options.rules) {\r\n options.rules.forEach(jsonRule => {\r\n try {\r\n const tokens = tokenize(jsonRule.if);\r\n const ast = parse(tokens);\r\n \r\n const addEffectRules = (effects: JSONEffect[], isElse: boolean) => {\r\n effects.forEach(effect => {\r\n Object.entries(effect).forEach(([key, selector]) => {\r\n if (typeof selector !== 'string' || !selector) return;\r\n let type = (key === 'require' ? 'required' : key) as EffectType;\r\n let expression = jsonRule.if;\r\n let finalAst = ast;\r\n\r\n if (type === 'hide') {\r\n type = 'show';\r\n finalAst = { type: 'UnaryExpression', operator: '!', argument: ast };\r\n expression = `!(${jsonRule.if})`;\r\n }\r\n\r\n if (isElse) {\r\n finalAst = { type: 'UnaryExpression', operator: '!', argument: finalAst };\r\n expression = `!(${expression})`;\r\n }\r\n\r\n const elements = formElement.querySelectorAll(selector);\r\n elements.forEach(node => {\r\n const el = node as HTMLElement;\r\n rules.push({\r\n id: jsonRule.id,\r\n element: el,\r\n type,\r\n expression,\r\n ast: finalAst,\r\n source: 'json',\r\n rawRule: jsonRule,\r\n disabled: jsonRule.disabled // v0.4\r\n });\r\n });\r\n });\r\n });\r\n };\r\n\r\n addEffectRules(jsonRule.then, false);\r\n if (jsonRule.else) {\r\n addEffectRules(jsonRule.else, true);\r\n }\r\n } catch (e) {\r\n console.warn(`[FormFx] Failed to parse JSON rule:`, jsonRule, e);\r\n }\r\n });\r\n }\r\n\r\n return rules;\r\n}\r\n\r\n/**\r\n * 依存しているフィールド(#id または @row.field)をASTから抽出する\r\n */\r\nexport function getDependencies(ast: ASTNode): { global: string[], row: string[] } {\r\n const global = new Set<string>();\r\n const row = new Set<string>();\r\n \r\n function traverse(node: ASTNode) {\r\n if (node.type === 'Identifier') {\r\n if (node.name.startsWith('@row.')) {\r\n row.add(node.name.substring(5));\r\n } else {\r\n global.add(node.name);\r\n }\r\n } else if (node.type === 'BinaryExpression' || node.type === 'LogicalExpression') {\r\n traverse(node.left);\r\n traverse(node.right);\r\n } else if (node.type === 'UnaryExpression') {\r\n traverse(node.argument);\r\n } else if (node.type === 'CallExpression') {\r\n node.arguments.forEach(traverse);\r\n } else if (node.type === 'ArrayExpression') {\r\n node.elements.forEach(traverse);\r\n }\r\n }\r\n \r\n traverse(ast);\r\n return {\r\n global: Array.from(global),\r\n row: Array.from(row)\r\n };\r\n}\r\n\r\nconst BUILTIN_FUNCTIONS: Record<string, (...args: any[]) => FXValue> = {\r\n in: (val, list) => {\r\n if (!Array.isArray(list)) return false;\r\n return list.includes(val);\r\n },\r\n contains: (val, sub) => {\r\n if (typeof val !== 'string') return false;\r\n return val.includes(sub);\r\n }\r\n};\r\n\r\nexport function runRules(formElement: HTMLElement, rules: Rule[], options: FormFxOptions): DebugInfo[] {\r\n const debugInfos: DebugInfo[] = [];\r\n // コンテキスト(値の辞書)を作成\r\n const globalContext: Record<string, FXValue> = {};\r\n \r\n // キャッシュして効率化することも考えられるが、まずは全ルール評価\r\n const allGlobalDeps = new Set<string>();\r\n rules.forEach(rule => {\r\n getDependencies(rule.ast).global.forEach(id => allGlobalDeps.add(id));\r\n });\r\n\r\n allGlobalDeps.forEach(id => {\r\n const el = findById(formElement, id);\r\n if (el) {\r\n globalContext[id] = getInputValue(el);\r\n } else {\r\n globalContext[id] = null;\r\n }\r\n });\r\n\r\n const baseEvalContext: EvaluationContext = {\r\n global: globalContext,\r\n functions: BUILTIN_FUNCTIONS\r\n };\r\n\r\n // 各ルールを評価して適用\r\n const elementToTypeToSource = new Map<HTMLElement, Map<EffectType, 'attribute' | 'json'>>();\r\n rules.forEach(rule => {\r\n if (!elementToTypeToSource.has(rule.element)) {\r\n elementToTypeToSource.set(rule.element, new Map());\r\n }\r\n const types = elementToTypeToSource.get(rule.element)!;\r\n // JSONが後にあるので、JSONがあれば上書きされる\r\n types.set(rule.type, rule.source);\r\n });\r\n\r\n rules.forEach(rule => {\r\n if (rule.disabled) return;\r\n\r\n // Determine if this rule should be skipped because a JSON rule for the same element and type exists.\r\n // JSON rules (added later in createRules) take precedence over attribute rules.\r\n if (rule.source === 'attribute') {\r\n const winner = elementToTypeToSource.get(rule.element)?.get(rule.type);\r\n if (winner === 'json') return;\r\n }\r\n\r\n try {\r\n // row context の構築\r\n let rowContext: Record<string, FXValue> | undefined = undefined;\r\n const rowItem = rule.element.closest('[data-fx-item]');\r\n if (rowItem) {\r\n rowContext = {};\r\n const deps = getDependencies(rule.ast);\r\n deps.row.forEach(fieldName => {\r\n const fieldEl = rowItem.querySelector(`[data-fx-field=\"${fieldName}\"]`);\r\n if (fieldEl) {\r\n // フィールド内の実際の入力要素を取得\r\n const input = fieldEl.querySelector('input, select, textarea') as HTMLElement;\r\n rowContext![fieldName] = input ? getInputValue(input) : null;\r\n } else {\r\n rowContext![fieldName] = null;\r\n }\r\n });\r\n }\r\n\r\n const evalContext: EvaluationContext = {\r\n ...baseEvalContext,\r\n row: rowContext\r\n };\r\n\r\n const result = evaluate(rule.ast, evalContext);\r\n const boolResult = !!result;\r\n\r\n if (options.debug) {\r\n debugInfos.push({\r\n rule,\r\n result: boolResult,\r\n elements: [rule.element]\r\n });\r\n console.debug(`[FormFx Debug] Rule: ${rule.type}=\"${rule.expression}\" (source: ${rule.source}, result: ${boolResult})`, {\r\n element: rule.element,\r\n result: boolResult,\r\n context: evalContext\r\n });\r\n }\r\n\r\n switch (rule.type) {\r\n case 'show':\r\n applyShow(rule.element, boolResult, options);\r\n break;\r\n case 'required':\r\n applyRequired(rule.element, boolResult);\r\n break;\r\n case 'disabled':\r\n applyDisabled(rule.element, boolResult);\r\n break;\r\n case 'enable':\r\n applyDisabled(rule.element, !boolResult);\r\n break;\r\n case 'clear':\r\n // 変化した瞬間(false -> true)のみクリア\r\n if (boolResult && rule.lastResult === false) {\r\n applyClear(rule.element);\r\n }\r\n break;\r\n }\r\n \r\n rule.lastResult = boolResult;\r\n\r\n } catch (e) {\r\n const errorMsg = e instanceof Error ? e.message : String(e);\r\n if (options.debug) {\r\n debugInfos.push({\r\n rule,\r\n result: 'error',\r\n error: errorMsg,\r\n elements: [rule.element]\r\n });\r\n console.warn(`[FormFx Debug] Evaluation failed: \"${rule.expression}\"`, e);\r\n } else {\r\n console.warn(`[FormFx] Failed to evaluate expression \"${rule.expression}\":`, e);\r\n }\r\n }\r\n });\r\n\r\n return debugInfos;\r\n}\r\n","export function setupEventListener(\r\n formElement: HTMLElement,\r\n callback: () => void,\r\n dependentIds: string[]\r\n): () => void {\r\n const handler = () => {\r\n callback();\r\n };\r\n\r\n // 依存フィールド単位での監視\r\n // ※ 動的に要素が追加される場合は MutationObserver がカバーする\r\n const cleanups: (() => void)[] = [];\r\n\r\n // 全体を監視しつつ、特定要素へのリスナーも検討可能だが、\r\n // シンプルさと確実性のために formElement への委譲を維持しつつ、\r\n // 将来的にはここで絞り込みを行う。\r\n // v0.2では「参照されているフィールドのみ」を意識した設計にする。\r\n \r\n formElement.addEventListener('input', handler);\r\n formElement.addEventListener('change', handler);\r\n\r\n return () => {\r\n formElement.removeEventListener('input', handler);\r\n formElement.removeEventListener('change', handler);\r\n };\r\n}\r\n\r\nexport function setupMutationObserver(\r\n formElement: HTMLElement,\r\n callback: () => void\r\n): MutationObserver {\r\n const observer = new MutationObserver((mutations) => {\r\n let shouldUpdate = false;\r\n for (const mutation of mutations) {\r\n if (mutation.type === 'childList' && (mutation.addedNodes.length > 0 || mutation.removedNodes.length > 0)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n \r\n if (shouldUpdate) {\r\n callback();\r\n }\r\n });\r\n\r\n observer.observe(formElement, {\r\n childList: true,\r\n subtree: true\r\n });\r\n\r\n return observer;\r\n}\r\n","import { RepeaterConfig } from '../../types';\r\n\r\nexport function setupRepeaters(\r\n formElement: HTMLElement,\r\n onUpdate: () => void\r\n): () => void {\r\n const repeaterElements = formElement.querySelectorAll<HTMLElement>('[data-fx-repeater]');\r\n const cleanups: (() => void)[] = [];\r\n\r\n repeaterElements.forEach(container => {\r\n const config: RepeaterConfig = {\r\n container,\r\n name: container.getAttribute('data-fx-name') || '',\r\n max: parseInt(container.getAttribute('data-fx-max') || '10', 10),\r\n addButton: container.querySelector<HTMLElement>('[data-fx-add]'),\r\n listContainer: container.querySelector<HTMLElement>('[data-fx-list]') || container,\r\n template: container.querySelector<HTMLTemplateElement>('template[data-fx-template]')!\r\n };\r\n\r\n if (!config.template) {\r\n console.warn('[FormFx] Repeater template not found', container);\r\n return;\r\n }\r\n\r\n const handleAdd = () => {\r\n const items = config.listContainer.querySelectorAll('[data-fx-item]');\r\n if (items.length < config.max) {\r\n addItem(config);\r\n reindex(config);\r\n onUpdate();\r\n }\r\n };\r\n\r\n if (config.addButton) {\r\n config.addButton.addEventListener('click', handleAdd);\r\n cleanups.push(() => config.addButton?.removeEventListener('click', handleAdd));\r\n }\r\n\r\n // 既存のアイテムに対してもイベント設定とリインデックスが必要\r\n const handleListClick = (e: Event) => {\r\n const target = e.target as HTMLElement;\r\n if (target.closest('[data-fx-remove]')) {\r\n const item = target.closest('[data-fx-item]');\r\n if (item) {\r\n item.remove();\r\n reindex(config);\r\n onUpdate();\r\n }\r\n }\r\n };\r\n\r\n config.listContainer.addEventListener('click', handleListClick);\r\n cleanups.push(() => config.listContainer.removeEventListener('click', handleListClick));\r\n\r\n // 初期化時に一度リインデックス\r\n reindex(config);\r\n });\r\n\r\n return () => cleanups.forEach(c => c());\r\n}\r\n\r\nfunction addItem(config: RepeaterConfig) {\r\n const content = config.template.content.cloneNode(true) as DocumentFragment;\r\n const item = content.querySelector('[data-fx-item]');\r\n if (item) {\r\n config.listContainer.appendChild(item);\r\n }\r\n}\r\n\r\nfunction reindex(config: RepeaterConfig) {\r\n const items = config.listContainer.querySelectorAll<HTMLElement>('[data-fx-item]');\r\n items.forEach((item, index) => {\r\n // data-fx-index 属性を付与(デバッグや特定用途向け)\r\n item.setAttribute('data-fx-index', index.toString());\r\n\r\n const fields = item.querySelectorAll<HTMLElement>('[data-fx-field]');\r\n fields.forEach(field => {\r\n const fieldName = field.getAttribute('data-fx-field');\r\n if (fieldName) {\r\n const inputs = field.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>('input, select, textarea');\r\n inputs.forEach(input => {\r\n input.name = `${config.name}[${index}].${fieldName}`;\r\n // 行内参照を容易にするため、input自体にも field 名を保持させることがあるが、\r\n // 今回は closest('[data-fx-field]') で解決する設計とした。\r\n });\r\n }\r\n });\r\n });\r\n\r\n // 追加ボタンの表示/非表示制御(任意だが親切)\r\n if (config.addButton) {\r\n if (items.length >= config.max) {\r\n config.addButton.style.display = 'none';\r\n } else {\r\n config.addButton.style.display = '';\r\n }\r\n }\r\n}\r\n","import { DebugInfo, PersistOptions } from '../../types';\r\n\r\nexport class DebugPanel {\r\n private container: HTMLElement | null = null;\r\n private shadow: ShadowRoot | null = null;\r\n private persistInfo: PersistOptions | null = null;\r\n private isMinimized = false;\r\n private pos = { x: 10, y: 10 };\r\n private isDragging = false;\r\n private dragStart = { x: 0, y: 0 };\r\n\r\n constructor() {\r\n this.loadState();\r\n this.container = document.createElement('div');\r\n this.container.id = 'formfx-debug-panel';\r\n this.shadow = this.container.attachShadow({ mode: 'open' });\r\n this.renderInitial();\r\n document.body.appendChild(this.container);\r\n this.setupDragging();\r\n }\r\n\r\n private loadState() {\r\n try {\r\n const saved = localStorage.getItem('formfx-debug-state');\r\n if (saved) {\r\n const state = JSON.parse(saved);\r\n this.isMinimized = !!state.isMinimized;\r\n if (state.pos) this.pos = state.pos;\r\n }\r\n } catch (e) {\r\n // Ignore\r\n }\r\n }\r\n\r\n private saveState() {\r\n try {\r\n localStorage.setItem('formfx-debug-state', JSON.stringify({\r\n isMinimized: this.isMinimized,\r\n pos: this.pos\r\n }));\r\n } catch (e) {\r\n // Ignore\r\n }\r\n }\r\n\r\n private setupDragging() {\r\n if (!this.shadow || !this.container) return;\r\n const header = this.shadow.querySelector('.header') as HTMLElement;\r\n if (!header) return;\r\n\r\n header.style.cursor = 'move';\r\n header.addEventListener('mousedown', (e) => {\r\n this.isDragging = true;\r\n this.dragStart = {\r\n x: e.clientX + this.pos.x,\r\n y: e.clientY + this.pos.y\r\n };\r\n e.preventDefault();\r\n });\r\n\r\n window.addEventListener('mousemove', (e) => {\r\n if (!this.isDragging) return;\r\n this.pos.x = this.dragStart.x - e.clientX;\r\n this.pos.y = this.dragStart.y - e.clientY;\r\n this.updatePosition();\r\n });\r\n\r\n window.addEventListener('mouseup', () => {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n this.saveState();\r\n }\r\n });\r\n\r\n const toggleBtn = this.shadow.getElementById('toggle-minimize');\r\n toggleBtn?.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.isMinimized = !this.isMinimized;\r\n this.renderInitial();\r\n this.updatePosition();\r\n this.saveState();\r\n });\r\n }\r\n\r\n private updatePosition() {\r\n if (!this.container) return;\r\n this.container.style.bottom = `${this.pos.y}px`;\r\n this.container.style.right = `${this.pos.x}px`;\r\n }\r\n\r\n setPersistInfo(info: PersistOptions) {\r\n this.persistInfo = info;\r\n }\r\n\r\n private renderInitial() {\r\n if (!this.shadow) return;\r\n this.shadow.innerHTML = `\r\n <style>\r\n :host {\r\n position: fixed;\r\n bottom: ${this.pos.y}px;\r\n right: ${this.pos.x}px;\r\n width: 350px;\r\n max-height: 80vh;\r\n background: rgba(0, 0, 0, 0.85);\r\n color: white;\r\n font-family: monospace;\r\n font-size: 12px;\r\n border-radius: 8px;\r\n overflow: hidden;\r\n z-index: 10000;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\r\n border: 1px solid #444;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .header {\r\n padding: 8px 12px;\r\n background: #222;\r\n border-bottom: 1px solid #444;\r\n font-weight: bold;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n user-select: none;\r\n }\r\n .content {\r\n padding: 8px;\r\n overflow-y: auto;\r\n display: ${this.isMinimized ? 'none' : 'block'};\r\n }\r\n .header-controls {\r\n display: flex;\r\n gap: 8px;\r\n }\r\n .btn-icon {\r\n cursor: pointer;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n background: #444;\r\n border: none;\r\n color: white;\r\n font-size: 10px;\r\n }\r\n .btn-icon:hover {\r\n background: #666;\r\n }\r\n .rule {\r\n margin-bottom: 8px;\r\n padding: 6px;\r\n border-radius: 4px;\r\n background: #333;\r\n }\r\n .rule-header {\r\n display: flex;\r\n justify-content: space-between;\r\n margin-bottom: 4px;\r\n }\r\n .rule-id {\r\n color: #aaa;\r\n font-size: 10px;\r\n }\r\n .rule-expr {\r\n word-break: break-all;\r\n color: #88ccff;\r\n }\r\n .status {\r\n font-weight: bold;\r\n padding: 2px 4px;\r\n border-radius: 2px;\r\n font-size: 10px;\r\n }\r\n .status-true { background: #228b22; }\r\n .status-false { background: #b22222; }\r\n .status-error { background: #ff4500; }\r\n .status-disabled { background: #666; color: #ccc; }\r\n .persist-badge {\r\n font-size: 9px;\r\n background: #444;\r\n padding: 1px 4px;\r\n border-radius: 4px;\r\n color: #00ff00;\r\n border: 1px solid #00ff00;\r\n }\r\n .header-top {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n .effects {\r\n margin-top: 4px;\r\n padding-left: 12px;\r\n border-left: 2px solid #555;\r\n font-size: 11px;\r\n }\r\n .effect-item {\r\n margin-top: 2px;\r\n }\r\n .effect-skipped {\r\n color: #888;\r\n text-decoration: line-through;\r\n }\r\n .error-msg {\r\n color: #ff6347;\r\n font-size: 10px;\r\n margin-top: 4px;\r\n }\r\n </style>\r\n <div class=\"header\">\r\n <div class=\"header-top\">\r\n <span>FormFx Debug</span>\r\n ${this.persistInfo ? `<span class=\"persist-badge\">PERSIST</span>` : ''}\r\n </div>\r\n <div class=\"header-controls\">\r\n <button id=\"toggle-minimize\" class=\"btn-icon\">${this.isMinimized ? '□' : '_'} </button>\r\n </div>\r\n </div>\r\n <div id=\"rule-list\" class=\"content\">\r\n Waiting for evaluation...\r\n </div>\r\n `;\r\n this.setupDragging();\r\n }\r\n\r\n update(debugInfos: DebugInfo[]) {\r\n if (!this.shadow) return;\r\n const listEl = this.shadow.getElementById('rule-list');\r\n if (!listEl) return;\r\n\r\n listEl.innerHTML = debugInfos.map(info => {\r\n const { rule, result, error } = info;\r\n \r\n let statusClass = result === 'error' ? 'status-error' : (result ? 'status-true' : 'status-false');\r\n let statusText = result === 'error' ? 'ERROR' : result.toString().toUpperCase();\r\n\r\n if (rule.disabled) {\r\n statusClass = 'status-disabled';\r\n statusText = 'DISABLED';\r\n }\r\n \r\n let effectInfo = `${rule.type} ${this.getSelector(rule.element)}`;\r\n if (result !== true && result !== 'error' && !rule.disabled) {\r\n effectInfo = `<span class=\"effect-skipped\">${effectInfo} (skipped)</span>`;\r\n }\r\n if (rule.disabled) {\r\n effectInfo = `<span class=\"effect-skipped\">${effectInfo}</span>`;\r\n }\r\n\r\n return `\r\n <div class=\"rule\">\r\n <div class=\"rule-header\">\r\n <span class=\"rule-id\">${rule.id || (rule.source === 'attribute' ? 'Attr' : 'JSON')}</span>\r\n <span class=\"status ${statusClass}\">${statusText}</span>\r\n </div>\r\n <div class=\"rule-expr\">${rule.expression}</div>\r\n <div class=\"effects\">\r\n <div class=\"effect-item\">${effectInfo}</div>\r\n </div>\r\n ${error ? `<div class=\"error-msg\">Error: ${error}</div>` : ''}\r\n </div>\r\n `;\r\n }).join('');\r\n }\r\n\r\n private getSelector(el: HTMLElement): string {\r\n if (el.id) return `#${el.id}`;\r\n if (el.className) return `.${el.className.split(' ').join('.')}`;\r\n return el.tagName.toLowerCase();\r\n }\r\n\r\n destroy() {\r\n if (this.container && this.container.parentNode) {\r\n this.container.parentNode.removeChild(this.container);\r\n }\r\n }\r\n}\r\n","import { FormFxOptions, Rule, JSONRule, RuleEditorOptions } from '../types';\r\nimport { createRules, runRules, getDependencies } from '../internal/engine';\r\nimport { setupEventListener, setupMutationObserver } from '../internal/observe';\r\nimport { setupRepeaters } from '../plugins/repeater';\r\nimport { DebugPanel } from '../internal/debug/panel';\r\n\r\nexport class FormFx {\r\n private rules: Rule[] = [];\r\n private options: FormFxOptions;\r\n private cleanupEvents: (() => void) | null = null;\r\n private cleanupRepeaters: (() => void) | null = null;\r\n private observer: MutationObserver | null = null;\r\n private debugPanel: DebugPanel | null = null;\r\n private isPaused = false;\r\n\r\n constructor(private formElement: HTMLElement, options: FormFxOptions = {}) {\r\n this.options = {\r\n disableOnHide: true,\r\n clearOnHide: false,\r\n ...options\r\n };\r\n\r\n // 永続化データの読み込み (JSON rulesのみ)\r\n this.loadPersistedRules();\r\n }\r\n\r\n mount(): void {\r\n // 0. Debug Panel の初期化\r\n if (this.options.debug) {\r\n this.debugPanel = new DebugPanel();\r\n if (this.options.persist) {\r\n this.debugPanel.setPersistInfo(this.options.persist);\r\n }\r\n }\r\n\r\n // 1. ルールの初回収集\r\n this.refreshRules();\r\n\r\n // 2. リピーターの初期化\r\n this.cleanupRepeaters = setupRepeaters(this.formElement, () => {\r\n // DOMが変化した後にルールを再収集して評価\r\n this.refreshRules();\r\n this.setupEvents(); // 依存フィールドが変わる可能性があるため再設定\r\n this.evaluate();\r\n });\r\n\r\n // 3. イベントリスナーの設定\r\n this.setupEvents();\r\n\r\n // 4. MutationObserverの設定(動的な属性追加などに対応)\r\n this.observer = setupMutationObserver(this.formElement, () => {\r\n this.refreshRules();\r\n this.setupEvents();\r\n this.evaluate();\r\n });\r\n\r\n // 5. 初回評価\r\n this.evaluate();\r\n }\r\n\r\n reEvaluate(): void {\r\n this.evaluate();\r\n }\r\n\r\n private setupEvents(): void {\r\n if (this.cleanupEvents) this.cleanupEvents();\r\n\r\n const dependentIds = new Set<string>();\r\n this.rules.forEach(rule => {\r\n getDependencies(rule.ast).global.forEach(id => {\r\n // IDだけでなくnameでも参照される可能性があるため、基本的には広めに監視する\r\n dependentIds.add(id);\r\n });\r\n });\r\n\r\n this.cleanupEvents = setupEventListener(this.formElement, () => {\r\n this.evaluate();\r\n }, Array.from(dependentIds));\r\n }\r\n\r\n private refreshRules(): void {\r\n // attributes ルールと JSON ルールの両方を収集\r\n // JSON rules が優先されるように後でマージするが、\r\n // createRules 内で JSON rules は後に追加されるように実装済み\r\n this.rules = createRules(this.formElement, this.options);\r\n }\r\n\r\n private evaluate(): void {\r\n if (this.isPaused) return;\r\n\r\n const debugInfos = runRules(this.formElement, this.rules, this.options);\r\n if (this.debugPanel) {\r\n this.debugPanel.update(debugInfos);\r\n }\r\n }\r\n\r\n /**\r\n * ルール評価を一時停止する (v0.4)\r\n */\r\n pause(): void {\r\n this.isPaused = true;\r\n }\r\n\r\n /**\r\n * ルール評価を再開する (v0.4)\r\n */\r\n resume(): void {\r\n this.isPaused = false;\r\n this.evaluate();\r\n }\r\n\r\n /**\r\n * JSONルールをエクスポートする (v0.4)\r\n */\r\n exportRules(): JSONRule[] {\r\n return this.options.rules || [];\r\n }\r\n\r\n /**\r\n * JSONルールをインポートする (v0.4)\r\n */\r\n importRules(rules: JSONRule[]): void {\r\n this.options.rules = rules;\r\n this.savePersistedRules();\r\n this.refreshRules();\r\n this.setupEvents();\r\n this.evaluate();\r\n }\r\n\r\n /**\r\n * Rule Editor を有効化する (v0.4)\r\n */\r\n async enableRuleEditor(options: RuleEditorOptions): Promise<void> {\r\n const { RuleEditor } = await import('../editor/RuleEditor');\r\n const editor = new RuleEditor(this, options);\r\n editor.mount();\r\n }\r\n\r\n private loadPersistedRules(): void {\r\n const { persist } = this.options;\r\n if (!persist) return;\r\n\r\n try {\r\n const storage = persist.storage === 'localStorage' ? localStorage : sessionStorage;\r\n const data = storage.getItem(persist.key);\r\n if (data) {\r\n this.options.rules = JSON.parse(data);\r\n }\r\n } catch (e) {\r\n console.error('[FormFx] Failed to load persisted rules:', e);\r\n }\r\n }\r\n\r\n private savePersistedRules(): void {\r\n const { persist, rules } = this.options;\r\n if (!persist || !rules) return;\r\n\r\n try {\r\n const storage = persist.storage === 'localStorage' ? localStorage : sessionStorage;\r\n storage.setItem(persist.key, JSON.stringify(rules));\r\n } catch (e) {\r\n console.error('[FormFx] Failed to save rules:', e);\r\n }\r\n }\r\n\r\n /**\r\n * JSONルールを有効化する\r\n * @param ruleId \r\n */\r\n enableRule(ruleId: string): void {\r\n this.rules.forEach(r => {\r\n if (r.id === ruleId && r.source === 'json') {\r\n r.disabled = false;\r\n }\r\n });\r\n if (this.options.rules) {\r\n this.options.rules.forEach(r => {\r\n if (r.id === ruleId) r.disabled = false;\r\n });\r\n this.savePersistedRules();\r\n }\r\n this.evaluate();\r\n }\r\n\r\n /**\r\n * JSONルールを無効化する\r\n * @param ruleId \r\n */\r\n disableRule(ruleId: string): void {\r\n this.rules.forEach(r => {\r\n if (r.id === ruleId && r.source === 'json') {\r\n r.disabled = true;\r\n }\r\n });\r\n if (this.options.rules) {\r\n this.options.rules.forEach(r => {\r\n if (r.id === ruleId) r.disabled = true;\r\n });\r\n this.savePersistedRules();\r\n }\r\n this.evaluate();\r\n }\r\n\r\n destroy(): void {\r\n if (this.cleanupEvents) this.cleanupEvents();\r\n if (this.cleanupRepeaters) this.cleanupRepeaters();\r\n if (this.observer) this.observer.disconnect();\r\n if (this.debugPanel) this.debugPanel.destroy();\r\n \r\n // イベントリスナーの再解除を確実にするため\r\n this.cleanupEvents = null;\r\n this.cleanupRepeaters = null;\r\n this.observer = null;\r\n this.debugPanel = null;\r\n\r\n // 適用されたスタイルや属性をリセットしたい場合があるが、\r\n // 基本的には「監視を止める」のが destroy の責務\r\n this.rules = [];\r\n }\r\n}\r\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { E as EffectType, b as FXValue, F as FormFx, d as FormFxDebugInfo, a as FormFxOptions, J as JSONEffect, c as JSONRule, P as PersistOptions, RuleEditor, R as RuleEditorOptions } from './editor.cjs';
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { E as EffectType, b as FXValue, F as FormFx, d as FormFxDebugInfo, a as FormFxOptions, J as JSONEffect, c as JSONRule, P as PersistOptions, RuleEditor, R as RuleEditorOptions } from './editor.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
export{a as RuleEditor}from'./chunk-6E5EWQVW.js';function w(e){if(e instanceof HTMLInputElement){if(e.type==="checkbox")return e.checked;if(e.type==="radio"){if(e.name){let r=(e.closest("form")||document).querySelector(`input[name="${e.name}"]:checked`);return r?r.value:null}return e.checked?e.value:null}return e.type==="number"||e.type==="range"?e.value===""?null:Number(e.value):e.value}return e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?e.value:null}function y(e){e instanceof HTMLInputElement?e.type==="checkbox"||e.type==="radio"?e.checked=false:e.value="":e instanceof HTMLSelectElement?(e.selectedIndex=-1,e.value=""):e instanceof HTMLTextAreaElement?e.value="":e.querySelectorAll("input, select, textarea").forEach(r=>y(r));}function E(e,t){"disabled"in e?e.disabled=t:e.querySelectorAll("input, select, textarea").forEach(s=>{s.disabled=t;});}function O(e,t,r){let s=e.style.display!=="none";t?(e.style.display=e.dataset.fxOriginalDisplay||"",r.disableOnHide&&!s&&E(e,false)):(s&&!e.dataset.fxOriginalDisplay&&(e.dataset.fxOriginalDisplay=e.style.display),e.style.display="none",s&&((e.dataset.fxClearOnHide==="true"||r.clearOnHide)&&y(e),r.disableOnHide&&E(e,true)));}function N(e,t){e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?e.required=t:e.querySelectorAll("input, select, textarea").forEach(s=>{s.required=t;});}function S(e,t){E(e,t);}function H(e){y(e);}function I(e,t){let r=e.querySelector(`#${t.replace(/([#;?%&,.+*~\':"!^$[\]()=>|/@])/g,"\\$1")}`);if(r)return r;let s=e.querySelector(`[name="${t}"]`);return s||e.querySelector(`[data-fx-id="${t}"]`)}function h(e,t){switch(e.type){case "Literal":return e.value;case "Identifier":{if(e.name.startsWith("@row.")){let r=e.name.substring(5);return t.row&&t.row[r]!==void 0?t.row[r]:null}return t.global[e.name]!==void 0?t.global[e.name]:null}case "UnaryExpression":if(e.operator==="!")return !h(e.argument,t);throw new Error(`Unknown unary operator: ${e.operator}`);case "BinaryExpression":{let r=h(e.left,t),s=h(e.right,t);if(e.operator==="==")return r==s;if(e.operator==="!=")return r!=s;if(e.operator===">")return r>s;if(e.operator===">=")return r>=s;if(e.operator==="<")return r<s;if(e.operator==="<=")return r<=s;if(e.operator==="+")return r+s;if(e.operator==="-")return r-s;if(e.operator==="*")return r*s;if(e.operator==="/")return r/s;if(e.operator==="%")return r%s;throw new Error(`Unknown binary operator: ${e.operator}`)}case "LogicalExpression":{let r=h(e.left,t);if(e.operator==="&&")return r&&h(e.right,t);if(e.operator==="||")return r||h(e.right,t);throw new Error(`Unknown logical operator: ${e.operator}`)}case "CallExpression":{let r=t.functions[e.callee];if(!r)throw new Error(`Unknown function: ${e.callee}`);let s=e.arguments.map(i=>h(i,t));return r(...s)}case "ArrayExpression":return e.elements.map(r=>h(r,t));default:throw new Error(`Unknown AST node type: ${e.type}`)}}function R(e){let t=0;function r(){return s()}function s(){let o=i();for(;t<e.length&&e[t].value==="||";){let c=e[t].value;t++;let f=i();o={type:"LogicalExpression",operator:c,left:o,right:f};}return o}function i(){let o=n();for(;t<e.length&&e[t].value==="&&";){let c=e[t].value;t++;let f=n();o={type:"LogicalExpression",operator:c,left:o,right:f};}return o}function n(){let o=u(),c=["==","!=",">",">=","<","<="];for(;t<e.length&&c.includes(e[t].value);){let f=e[t].value;t++;let d=u();o={type:"BinaryExpression",operator:f,left:o,right:d};}return o}function u(){let o=p();for(;t<e.length&&(e[t].value==="+"||e[t].value==="-");){let c=e[t].value;t++;let f=p();o={type:"BinaryExpression",operator:c,left:o,right:f};}return o}function p(){let o=a();for(;t<e.length&&(e[t].value==="*"||e[t].value==="/"||e[t].value==="%");){let c=e[t].value;t++;let f=a();o={type:"BinaryExpression",operator:c,left:o,right:f};}return o}function a(){return t<e.length&&e[t].value==="!"?(t++,{type:"UnaryExpression",operator:"!",argument:a()}):l()}function l(){let o=e[t];if(o.type==="PAREN"&&o.value==="("){t++;let c=r();if(e[t]?.value!==")")throw new Error("Expected )");return t++,c}if(o.type==="IDENTIFIER"){if(t++,t<e.length&&e[t].type==="PAREN"&&e[t].value==="("){t++;let c=[];if(!(e[t].type==="PAREN"&&e[t].value===")"))for(;;){if(c.push(r()),e[t].type==="COMMA"){t++;continue}if(e[t].type==="PAREN"&&e[t].value===")")break;throw new Error(`Expected , or ) in function call "${o.value}"`)}return t++,{type:"CallExpression",callee:o.value,arguments:c}}return {type:"Identifier",name:o.value}}if(o.type==="BRACKET"&&o.value==="["){t++;let c=[];if(!(e[t].type==="BRACKET"&&e[t].value==="]"))for(;;){if(c.push(r()),e[t].type==="COMMA"){t++;continue}if(e[t].type==="BRACKET"&&e[t].value==="]")break;throw new Error("Expected , or ] in array literal")}return t++,{type:"ArrayExpression",elements:c}}if(o.type==="NUMBER")return t++,{type:"Literal",value:parseFloat(o.value)};if(o.type==="STRING")return t++,{type:"Literal",value:o.value};if(o.type==="BOOLEAN")return t++,{type:"Literal",value:o.value==="true"};throw new Error(`Unexpected token: ${o.value}`)}return r()}function A(e){let t=[],r=0;for(;r<e.length;){let s=e[r];if(/\s/.test(s)){r++;continue}if(s==="("||s===")"){t.push({type:"PAREN",value:s}),r++;continue}if(s==="["||s==="]"){t.push({type:"BRACKET",value:s}),r++;continue}if(s===","){t.push({type:"COMMA",value:s}),r++;continue}if(s==="#"||s==="@"){let n=s==="@",u=n?"@":"";if(r++,n){let p="";for(;r<e.length&&/[a-zA-Z0-9_-]/.test(e[r]);)p+=e[r],r++;if(u+=p,e[r]===".")for(u+=".",r++;r<e.length&&/[a-zA-Z0-9_-]/.test(e[r]);)u+=e[r],r++;}else for(;r<e.length&&/[a-zA-Z0-9_-]/.test(e[r]);)u+=e[r],r++;t.push({type:"IDENTIFIER",value:u});continue}if(/[0-9]/.test(s)){let n="";for(;r<e.length&&/[0-9.]/.test(e[r]);)n+=e[r],r++;t.push({type:"NUMBER",value:n});continue}if(s==="'"){let n="";for(r++;r<e.length&&e[r]!=="'";)n+=e[r],r++;r++,t.push({type:"STRING",value:n});continue}if(s==="="&&e[r+1]==="="){t.push({type:"OPERATOR",value:"=="}),r+=2;continue}if(s==="!"&&e[r+1]==="="){t.push({type:"OPERATOR",value:"!="}),r+=2;continue}if(s===">"&&e[r+1]==="="){t.push({type:"OPERATOR",value:">="}),r+=2;continue}if(s==="<"&&e[r+1]==="="){t.push({type:"OPERATOR",value:"<="}),r+=2;continue}if(s===">"){t.push({type:"OPERATOR",value:">"}),r++;continue}if(s==="<"){t.push({type:"OPERATOR",value:"<"}),r++;continue}if(s==="&"&&e[r+1]==="&"){t.push({type:"OPERATOR",value:"&&"}),r+=2;continue}if(s==="|"&&e[r+1]==="|"){t.push({type:"OPERATOR",value:"||"}),r+=2;continue}if(s==="!"){t.push({type:"OPERATOR",value:"!"}),r++;continue}if(s==="+"||s==="-"||s==="*"||s==="/"||s==="%"){t.push({type:"OPERATOR",value:s}),r++;continue}let i=e.slice(r).match(/^[a-zA-Z][a-zA-Z0-9_]*/);if(i){let n=i[0];n==="true"||n==="false"?(t.push({type:"BOOLEAN",value:n}),r+=n.length):(t.push({type:"IDENTIFIER",value:n}),r+=n.length);continue}throw new Error(`Unexpected character: ${s} at position ${r}`)}return t}function F(e,t={}){let r=[];return ["show","required","disabled","enable","clear"].forEach(i=>{let n=`data-fx-${i}`;e.querySelectorAll(`[${n}]`).forEach(p=>{let a=p.getAttribute(n)||"";try{let l=A(a),o=R(l);r.push({element:p,type:i,expression:a,ast:o,source:"attribute"});}catch(l){console.warn(`[FormFx] Failed to parse expression "${a}" for ${n}:`,l);}});}),t.rules&&t.rules.forEach(i=>{try{let n=A(i.if),u=R(n),p=(a,l)=>{a.forEach(o=>{Object.entries(o).forEach(([c,f])=>{if(typeof f!="string"||!f)return;let d=c==="require"?"required":c,g=i.if,m=u;d==="hide"&&(d="show",m={type:"UnaryExpression",operator:"!",argument:u},g=`!(${i.if})`),l&&(m={type:"UnaryExpression",operator:"!",argument:m},g=`!(${g})`),e.querySelectorAll(f).forEach(v=>{let q=v;r.push({id:i.id,element:q,type:d,expression:g,ast:m,source:"json",rawRule:i,disabled:i.disabled});});});});};p(i.then,!1),i.else&&p(i.else,!0);}catch(n){console.warn("[FormFx] Failed to parse JSON rule:",i,n);}}),r}function x(e){let t=new Set,r=new Set;function s(i){i.type==="Identifier"?i.name.startsWith("@row.")?r.add(i.name.substring(5)):t.add(i.name):i.type==="BinaryExpression"||i.type==="LogicalExpression"?(s(i.left),s(i.right)):i.type==="UnaryExpression"?s(i.argument):i.type==="CallExpression"?i.arguments.forEach(s):i.type==="ArrayExpression"&&i.elements.forEach(s);}return s(e),{global:Array.from(t),row:Array.from(r)}}var z={in:(e,t)=>Array.isArray(t)?t.includes(e):false,contains:(e,t)=>typeof e!="string"?false:e.includes(t)};function $(e,t,r){let s=[],i={},n=new Set;t.forEach(a=>{x(a.ast).global.forEach(l=>n.add(l));}),n.forEach(a=>{let l=I(e,a);l?i[a]=w(l):i[a]=null;});let u={global:i,functions:z},p=new Map;return t.forEach(a=>{p.has(a.element)||p.set(a.element,new Map),p.get(a.element).set(a.type,a.source);}),t.forEach(a=>{if(!a.disabled&&!(a.source==="attribute"&&p.get(a.element)?.get(a.type)==="json"))try{let l,o=a.element.closest("[data-fx-item]");o&&(l={},x(a.ast).row.forEach(m=>{let T=o.querySelector(`[data-fx-field="${m}"]`);if(T){let v=T.querySelector("input, select, textarea");l[m]=v?w(v):null;}else l[m]=null;}));let c={...u,row:l},d=!!h(a.ast,c);switch(r.debug&&(s.push({rule:a,result:d,elements:[a.element]}),console.debug(`[FormFx Debug] Rule: ${a.type}="${a.expression}" (source: ${a.source}, result: ${d})`,{element:a.element,result:d,context:c})),a.type){case "show":O(a.element,d,r);break;case "required":N(a.element,d);break;case "disabled":S(a.element,d);break;case "enable":S(a.element,!d);break;case "clear":d&&a.lastResult===!1&&H(a.element);break}a.lastResult=d;}catch(l){let o=l instanceof Error?l.message:String(l);r.debug?(s.push({rule:a,result:"error",error:o,elements:[a.element]}),console.warn(`[FormFx Debug] Evaluation failed: "${a.expression}"`,l)):console.warn(`[FormFx] Failed to evaluate expression "${a.expression}":`,l);}}),s}function P(e,t,r){let s=()=>{t();};return e.addEventListener("input",s),e.addEventListener("change",s),()=>{e.removeEventListener("input",s),e.removeEventListener("change",s);}}function C(e,t){let r=new MutationObserver(s=>{let i=false;for(let n of s)if(n.type==="childList"&&(n.addedNodes.length>0||n.removedNodes.length>0)){i=true;break}i&&t();});return r.observe(e,{childList:true,subtree:true}),r}function D(e,t){let r=e.querySelectorAll("[data-fx-repeater]"),s=[];return r.forEach(i=>{let n={name:i.getAttribute("data-fx-name")||"",max:parseInt(i.getAttribute("data-fx-max")||"10",10),addButton:i.querySelector("[data-fx-add]"),listContainer:i.querySelector("[data-fx-list]")||i,template:i.querySelector("template[data-fx-template]")};if(!n.template){console.warn("[FormFx] Repeater template not found",i);return}let u=()=>{n.listContainer.querySelectorAll("[data-fx-item]").length<n.max&&(k(n),L(n),t());};n.addButton&&(n.addButton.addEventListener("click",u),s.push(()=>n.addButton?.removeEventListener("click",u)));let p=a=>{let l=a.target;if(l.closest("[data-fx-remove]")){let o=l.closest("[data-fx-item]");o&&(o.remove(),L(n),t());}};n.listContainer.addEventListener("click",p),s.push(()=>n.listContainer.removeEventListener("click",p)),L(n);}),()=>s.forEach(i=>i())}function k(e){let r=e.template.content.cloneNode(true).querySelector("[data-fx-item]");r&&e.listContainer.appendChild(r);}function L(e){let t=e.listContainer.querySelectorAll("[data-fx-item]");t.forEach((r,s)=>{r.setAttribute("data-fx-index",s.toString()),r.querySelectorAll("[data-fx-field]").forEach(n=>{let u=n.getAttribute("data-fx-field");u&&n.querySelectorAll("input, select, textarea").forEach(a=>{a.name=`${e.name}[${s}].${u}`;});});}),e.addButton&&(t.length>=e.max?e.addButton.style.display="none":e.addButton.style.display="");}var b=class{container=null;shadow=null;persistInfo=null;isMinimized=false;pos={x:10,y:10};isDragging=false;dragStart={x:0,y:0};constructor(){this.loadState(),this.container=document.createElement("div"),this.container.id="formfx-debug-panel",this.shadow=this.container.attachShadow({mode:"open"}),this.renderInitial(),document.body.appendChild(this.container),this.setupDragging();}loadState(){try{let t=localStorage.getItem("formfx-debug-state");if(t){let r=JSON.parse(t);this.isMinimized=!!r.isMinimized,r.pos&&(this.pos=r.pos);}}catch{}}saveState(){try{localStorage.setItem("formfx-debug-state",JSON.stringify({isMinimized:this.isMinimized,pos:this.pos}));}catch{}}setupDragging(){if(!this.shadow||!this.container)return;let t=this.shadow.querySelector(".header");if(!t)return;t.style.cursor="move",t.addEventListener("mousedown",s=>{this.isDragging=true,this.dragStart={x:s.clientX+this.pos.x,y:s.clientY+this.pos.y},s.preventDefault();}),window.addEventListener("mousemove",s=>{this.isDragging&&(this.pos.x=this.dragStart.x-s.clientX,this.pos.y=this.dragStart.y-s.clientY,this.updatePosition());}),window.addEventListener("mouseup",()=>{this.isDragging&&(this.isDragging=false,this.saveState());}),this.shadow.getElementById("toggle-minimize")?.addEventListener("click",s=>{s.stopPropagation(),this.isMinimized=!this.isMinimized,this.renderInitial(),this.updatePosition(),this.saveState();});}updatePosition(){this.container&&(this.container.style.bottom=`${this.pos.y}px`,this.container.style.right=`${this.pos.x}px`);}setPersistInfo(t){this.persistInfo=t;}renderInitial(){this.shadow&&(this.shadow.innerHTML=`
|
|
2
|
+
<style>
|
|
3
|
+
:host {
|
|
4
|
+
position: fixed;
|
|
5
|
+
bottom: ${this.pos.y}px;
|
|
6
|
+
right: ${this.pos.x}px;
|
|
7
|
+
width: 350px;
|
|
8
|
+
max-height: 80vh;
|
|
9
|
+
background: rgba(0, 0, 0, 0.85);
|
|
10
|
+
color: white;
|
|
11
|
+
font-family: monospace;
|
|
12
|
+
font-size: 12px;
|
|
13
|
+
border-radius: 8px;
|
|
14
|
+
overflow: hidden;
|
|
15
|
+
z-index: 10000;
|
|
16
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
|
|
17
|
+
border: 1px solid #444;
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
}
|
|
21
|
+
.header {
|
|
22
|
+
padding: 8px 12px;
|
|
23
|
+
background: #222;
|
|
24
|
+
border-bottom: 1px solid #444;
|
|
25
|
+
font-weight: bold;
|
|
26
|
+
display: flex;
|
|
27
|
+
justify-content: space-between;
|
|
28
|
+
align-items: center;
|
|
29
|
+
user-select: none;
|
|
30
|
+
}
|
|
31
|
+
.content {
|
|
32
|
+
padding: 8px;
|
|
33
|
+
overflow-y: auto;
|
|
34
|
+
display: ${this.isMinimized?"none":"block"};
|
|
35
|
+
}
|
|
36
|
+
.header-controls {
|
|
37
|
+
display: flex;
|
|
38
|
+
gap: 8px;
|
|
39
|
+
}
|
|
40
|
+
.btn-icon {
|
|
41
|
+
cursor: pointer;
|
|
42
|
+
padding: 2px 6px;
|
|
43
|
+
border-radius: 4px;
|
|
44
|
+
background: #444;
|
|
45
|
+
border: none;
|
|
46
|
+
color: white;
|
|
47
|
+
font-size: 10px;
|
|
48
|
+
}
|
|
49
|
+
.btn-icon:hover {
|
|
50
|
+
background: #666;
|
|
51
|
+
}
|
|
52
|
+
.rule {
|
|
53
|
+
margin-bottom: 8px;
|
|
54
|
+
padding: 6px;
|
|
55
|
+
border-radius: 4px;
|
|
56
|
+
background: #333;
|
|
57
|
+
}
|
|
58
|
+
.rule-header {
|
|
59
|
+
display: flex;
|
|
60
|
+
justify-content: space-between;
|
|
61
|
+
margin-bottom: 4px;
|
|
62
|
+
}
|
|
63
|
+
.rule-id {
|
|
64
|
+
color: #aaa;
|
|
65
|
+
font-size: 10px;
|
|
66
|
+
}
|
|
67
|
+
.rule-expr {
|
|
68
|
+
word-break: break-all;
|
|
69
|
+
color: #88ccff;
|
|
70
|
+
}
|
|
71
|
+
.status {
|
|
72
|
+
font-weight: bold;
|
|
73
|
+
padding: 2px 4px;
|
|
74
|
+
border-radius: 2px;
|
|
75
|
+
font-size: 10px;
|
|
76
|
+
}
|
|
77
|
+
.status-true { background: #228b22; }
|
|
78
|
+
.status-false { background: #b22222; }
|
|
79
|
+
.status-error { background: #ff4500; }
|
|
80
|
+
.status-disabled { background: #666; color: #ccc; }
|
|
81
|
+
.persist-badge {
|
|
82
|
+
font-size: 9px;
|
|
83
|
+
background: #444;
|
|
84
|
+
padding: 1px 4px;
|
|
85
|
+
border-radius: 4px;
|
|
86
|
+
color: #00ff00;
|
|
87
|
+
border: 1px solid #00ff00;
|
|
88
|
+
}
|
|
89
|
+
.header-top {
|
|
90
|
+
display: flex;
|
|
91
|
+
align-items: center;
|
|
92
|
+
gap: 8px;
|
|
93
|
+
}
|
|
94
|
+
.effects {
|
|
95
|
+
margin-top: 4px;
|
|
96
|
+
padding-left: 12px;
|
|
97
|
+
border-left: 2px solid #555;
|
|
98
|
+
font-size: 11px;
|
|
99
|
+
}
|
|
100
|
+
.effect-item {
|
|
101
|
+
margin-top: 2px;
|
|
102
|
+
}
|
|
103
|
+
.effect-skipped {
|
|
104
|
+
color: #888;
|
|
105
|
+
text-decoration: line-through;
|
|
106
|
+
}
|
|
107
|
+
.error-msg {
|
|
108
|
+
color: #ff6347;
|
|
109
|
+
font-size: 10px;
|
|
110
|
+
margin-top: 4px;
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
113
|
+
<div class="header">
|
|
114
|
+
<div class="header-top">
|
|
115
|
+
<span>FormFx Debug</span>
|
|
116
|
+
${this.persistInfo?'<span class="persist-badge">PERSIST</span>':""}
|
|
117
|
+
</div>
|
|
118
|
+
<div class="header-controls">
|
|
119
|
+
<button id="toggle-minimize" class="btn-icon">${this.isMinimized?"\u25A1":"_"} </button>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
<div id="rule-list" class="content">
|
|
123
|
+
Waiting for evaluation...
|
|
124
|
+
</div>
|
|
125
|
+
`,this.setupDragging());}update(t){if(!this.shadow)return;let r=this.shadow.getElementById("rule-list");r&&(r.innerHTML=t.map(s=>{let{rule:i,result:n,error:u}=s,p=n==="error"?"status-error":n?"status-true":"status-false",a=n==="error"?"ERROR":n.toString().toUpperCase();i.disabled&&(p="status-disabled",a="DISABLED");let l=`${i.type} ${this.getSelector(i.element)}`;return n!==true&&n!=="error"&&!i.disabled&&(l=`<span class="effect-skipped">${l} (skipped)</span>`),i.disabled&&(l=`<span class="effect-skipped">${l}</span>`),`
|
|
126
|
+
<div class="rule">
|
|
127
|
+
<div class="rule-header">
|
|
128
|
+
<span class="rule-id">${i.id||(i.source==="attribute"?"Attr":"JSON")}</span>
|
|
129
|
+
<span class="status ${p}">${a}</span>
|
|
130
|
+
</div>
|
|
131
|
+
<div class="rule-expr">${i.expression}</div>
|
|
132
|
+
<div class="effects">
|
|
133
|
+
<div class="effect-item">${l}</div>
|
|
134
|
+
</div>
|
|
135
|
+
${u?`<div class="error-msg">Error: ${u}</div>`:""}
|
|
136
|
+
</div>
|
|
137
|
+
`}).join(""));}getSelector(t){return t.id?`#${t.id}`:t.className?`.${t.className.split(" ").join(".")}`:t.tagName.toLowerCase()}destroy(){this.container&&this.container.parentNode&&this.container.parentNode.removeChild(this.container);}};var M=class{constructor(t,r={}){this.formElement=t;this.options={disableOnHide:true,clearOnHide:false,...r},this.loadPersistedRules();}rules=[];options;cleanupEvents=null;cleanupRepeaters=null;observer=null;debugPanel=null;isPaused=false;mount(){this.options.debug&&(this.debugPanel=new b,this.options.persist&&this.debugPanel.setPersistInfo(this.options.persist)),this.refreshRules(),this.cleanupRepeaters=D(this.formElement,()=>{this.refreshRules(),this.setupEvents(),this.evaluate();}),this.setupEvents(),this.observer=C(this.formElement,()=>{this.refreshRules(),this.setupEvents(),this.evaluate();}),this.evaluate();}reEvaluate(){this.evaluate();}setupEvents(){this.cleanupEvents&&this.cleanupEvents();let t=new Set;this.rules.forEach(r=>{x(r.ast).global.forEach(s=>{t.add(s);});}),this.cleanupEvents=P(this.formElement,()=>{this.evaluate();},Array.from(t));}refreshRules(){this.rules=F(this.formElement,this.options);}evaluate(){if(this.isPaused)return;let t=$(this.formElement,this.rules,this.options);this.debugPanel&&this.debugPanel.update(t);}pause(){this.isPaused=true;}resume(){this.isPaused=false,this.evaluate();}exportRules(){return this.options.rules||[]}importRules(t){this.options.rules=t,this.savePersistedRules(),this.refreshRules(),this.setupEvents(),this.evaluate();}async enableRuleEditor(t){let{RuleEditor:r}=await import('./editor.js');new r(this,t).mount();}loadPersistedRules(){let{persist:t}=this.options;if(t)try{let s=(t.storage==="localStorage"?localStorage:sessionStorage).getItem(t.key);s&&(this.options.rules=JSON.parse(s));}catch(r){console.error("[FormFx] Failed to load persisted rules:",r);}}savePersistedRules(){let{persist:t,rules:r}=this.options;if(!(!t||!r))try{(t.storage==="localStorage"?localStorage:sessionStorage).setItem(t.key,JSON.stringify(r));}catch(s){console.error("[FormFx] Failed to save rules:",s);}}enableRule(t){this.rules.forEach(r=>{r.id===t&&r.source==="json"&&(r.disabled=false);}),this.options.rules&&(this.options.rules.forEach(r=>{r.id===t&&(r.disabled=false);}),this.savePersistedRules()),this.evaluate();}disableRule(t){this.rules.forEach(r=>{r.id===t&&r.source==="json"&&(r.disabled=true);}),this.options.rules&&(this.options.rules.forEach(r=>{r.id===t&&(r.disabled=true);}),this.savePersistedRules()),this.evaluate();}destroy(){this.cleanupEvents&&this.cleanupEvents(),this.cleanupRepeaters&&this.cleanupRepeaters(),this.observer&&this.observer.disconnect(),this.debugPanel&&this.debugPanel.destroy(),this.cleanupEvents=null,this.cleanupRepeaters=null,this.observer=null,this.debugPanel=null,this.rules=[];}};export{M as FormFx};//# sourceMappingURL=index.js.map
|
|
138
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/dom/value.ts","../src/internal/dom/effects.ts","../src/internal/dom/select.ts","../src/internal/expr/evaluator.ts","../src/internal/expr/parser.ts","../src/internal/expr/tokenizer.ts","../src/internal/engine.ts","../src/internal/observe.ts","../src/plugins/repeater/index.ts","../src/internal/debug/panel.ts","../src/core/FormFx.ts"],"names":["getInputValue","el","checked","clearValue","input","setDisabled","disabled","applyShow","show","options","isCurrentlyVisible","applyRequired","required","applyDisabled","applyClear","findById","root","id","byName","evaluate","node","context","fieldName","left","right","func","args","arg","parse","tokens","current","walk","parseLogicalOr","parseLogicalAnd","operator","parseComparison","parseAdditive","comparisonOps","parseMultiplicative","parseUnary","parsePrimary","token","elements","tokenize","char","isRow","value","rowPrefix","idMatch","word","createRules","formElement","rules","type","attrName","expression","ast","e","jsonRule","addEffectRules","effects","isElse","effect","key","selector","finalAst","getDependencies","global","row","traverse","BUILTIN_FUNCTIONS","val","list","sub","runRules","debugInfos","globalContext","allGlobalDeps","rule","baseEvalContext","elementToTypeToSource","rowContext","rowItem","fieldEl","evalContext","boolResult","errorMsg","setupEventListener","callback","dependentIds","handler","setupMutationObserver","observer","mutations","shouldUpdate","mutation","setupRepeaters","onUpdate","repeaterElements","cleanups","container","config","handleAdd","addItem","reindex","handleListClick","target","item","c","items","index","field","DebugPanel","saved","state","header","info","listEl","result","error","statusClass","statusText","effectInfo","FormFx","RuleEditor","persist","data","ruleId"],"mappings":"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","file":"index.js","sourcesContent":["import { FXValue } from '../../types';\r\n\r\nexport function getInputValue(el: HTMLElement): FXValue {\r\n if (el instanceof HTMLInputElement) {\r\n if (el.type === 'checkbox') {\r\n return el.checked;\r\n }\r\n if (el.type === 'radio') {\r\n // ラジオボタンの場合は、同じnameを持つチェックされている要素を探す\r\n if (el.name) {\r\n const form = el.closest('form') || document;\r\n const checked = form.querySelector(`input[name=\"${el.name}\"]:checked`) as HTMLInputElement;\r\n return checked ? checked.value : null;\r\n }\r\n return el.checked ? el.value : null;\r\n }\r\n if (el.type === 'number' || el.type === 'range') {\r\n return el.value === '' ? null : Number(el.value);\r\n }\r\n return el.value;\r\n }\r\n \r\n if (el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) {\r\n return el.value;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function clearValue(el: HTMLElement): void {\r\n if (el instanceof HTMLInputElement) {\r\n if (el.type === 'checkbox' || el.type === 'radio') {\r\n el.checked = false;\r\n } else {\r\n el.value = '';\r\n }\r\n } else if (el instanceof HTMLSelectElement) {\r\n el.selectedIndex = -1;\r\n el.value = '';\r\n } else if (el instanceof HTMLTextAreaElement) {\r\n el.value = '';\r\n } else {\r\n // コンテナの場合は配下の要素をクリア\r\n const inputs = el.querySelectorAll('input, select, textarea');\r\n inputs.forEach(input => clearValue(input as HTMLElement));\r\n }\r\n}\r\n\r\nexport function setDisabled(el: HTMLElement, disabled: boolean): void {\r\n if ('disabled' in el) {\r\n (el as any).disabled = disabled;\r\n } else {\r\n // コンテナの場合は配下の要素を制御\r\n const inputs = el.querySelectorAll('input, select, textarea');\r\n inputs.forEach(input => {\r\n (input as HTMLInputElement).disabled = disabled;\r\n });\r\n }\r\n}\r\n","import { FormFxOptions } from '../../types';\r\nimport { clearValue, setDisabled } from './value';\r\n\r\nexport function applyShow(el: HTMLElement, show: boolean, options: FormFxOptions): void {\r\n const isCurrentlyVisible = el.style.display !== 'none';\r\n \r\n if (show) {\r\n el.style.display = el.dataset.fxOriginalDisplay || '';\r\n // 再表示されたときに disabled を解除するかどうかは要件にないが、\r\n // disableOnHide=true の場合は対称性を持たせるのが一般的\r\n if (options.disableOnHide && !isCurrentlyVisible) {\r\n setDisabled(el, false);\r\n }\r\n } else {\r\n if (isCurrentlyVisible && !el.dataset.fxOriginalDisplay) {\r\n el.dataset.fxOriginalDisplay = el.style.display;\r\n }\r\n el.style.display = 'none';\r\n \r\n // 非表示になったときの追加処理\r\n if (isCurrentlyVisible) {\r\n if (el.dataset.fxClearOnHide === 'true' || options.clearOnHide) {\r\n clearValue(el);\r\n }\r\n if (options.disableOnHide) {\r\n setDisabled(el, true);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function applyRequired(el: HTMLElement, required: boolean): void {\r\n if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) {\r\n el.required = required;\r\n } else {\r\n // コンテナの場合、配下の全ての入力要素に適用\r\n const inputs = el.querySelectorAll('input, select, textarea');\r\n inputs.forEach(input => {\r\n (input as HTMLInputElement).required = required;\r\n });\r\n }\r\n}\r\n\r\nexport function applyDisabled(el: HTMLElement, disabled: boolean): void {\r\n setDisabled(el, disabled);\r\n}\r\n\r\nexport function applyClear(el: HTMLElement): void {\r\n clearValue(el);\r\n}\r\n","export function findById(root: HTMLElement, id: string): HTMLElement | null {\r\n // 1. Try to find by ID\r\n const el = root.querySelector(`#${id.replace(/([#;?%&,.+*~\\':\"!^$[\\]()=>|/@])/g, '\\\\$1')}`);\r\n if (el) return el as HTMLElement;\r\n\r\n // 2. Try to find by name attribute (v1.0 enhancement)\r\n const byName = root.querySelector(`[name=\"${id}\"]`);\r\n if (byName) return byName as HTMLElement;\r\n \r\n // 3. Try to find by data-fx-id\r\n return root.querySelector(`[data-fx-id=\"${id}\"]`) as HTMLElement | null;\r\n}\r\n\r\nexport function findByFxAttr(root: HTMLElement, attr: string): HTMLElement[] {\r\n return Array.from(root.querySelectorAll(`[${attr}]`));\r\n}\r\n","import { ASTNode, FXValue, EvaluationContext } from '../../types';\r\n\r\nexport function evaluate(node: ASTNode, context: EvaluationContext): FXValue {\r\n switch (node.type) {\r\n case 'Literal':\r\n return node.value;\r\n\r\n case 'Identifier': {\r\n if (node.name.startsWith('@row.')) {\r\n const fieldName = node.name.substring(5);\r\n return context.row && context.row[fieldName] !== undefined ? context.row[fieldName] : null;\r\n }\r\n return context.global[node.name] !== undefined ? context.global[node.name] : null;\r\n }\r\n\r\n case 'UnaryExpression':\r\n if (node.operator === '!') {\r\n return !evaluate(node.argument, context);\r\n }\r\n throw new Error(`Unknown unary operator: ${(node as any).operator}`);\r\n\r\n case 'BinaryExpression': {\r\n const left = evaluate(node.left, context);\r\n const right = evaluate(node.right, context);\r\n if (node.operator === '==') return left == right;\r\n if (node.operator === '!=') return left != right;\r\n if (node.operator === '>') return (left as any) > (right as any);\r\n if (node.operator === '>=') return (left as any) >= (right as any);\r\n if (node.operator === '<') return (left as any) < (right as any);\r\n if (node.operator === '<=') return (left as any) <= (right as any);\r\n if (node.operator === '+') return (left as any) + (right as any);\r\n if (node.operator === '-') return (left as any) - (right as any);\r\n if (node.operator === '*') return (left as any) * (right as any);\r\n if (node.operator === '/') return (left as any) / (right as any);\r\n if (node.operator === '%') return (left as any) % (right as any);\r\n throw new Error(`Unknown binary operator: ${node.operator}`);\r\n }\r\n\r\n case 'LogicalExpression': {\r\n const left = evaluate(node.left, context);\r\n if (node.operator === '&&') {\r\n return left && evaluate(node.right, context);\r\n }\r\n if (node.operator === '||') {\r\n return left || evaluate(node.right, context);\r\n }\r\n throw new Error(`Unknown logical operator: ${node.operator}`);\r\n }\r\n\r\n case 'CallExpression': {\r\n const func = context.functions[node.callee];\r\n if (!func) {\r\n throw new Error(`Unknown function: ${node.callee}`);\r\n }\r\n const args = node.arguments.map((arg: ASTNode) => evaluate(arg, context));\r\n return func(...args);\r\n }\r\n\r\n case 'ArrayExpression': {\r\n return node.elements.map((el: ASTNode) => evaluate(el, context));\r\n }\r\n\r\n default:\r\n throw new Error(`Unknown AST node type: ${(node as any).type}`);\r\n }\r\n}\r\n","import { ASTNode, Token } from '../../types';\r\n\r\n/**\r\n * 簡易的な再帰下降構文解析器\r\n * 優先順位:\r\n * 1. Primary (Identifier, Literal, Parentheses)\r\n * 2. Unary (!)\r\n * 3. Comparison (==, !=)\r\n * 4. Logical AND (&&)\r\n * 5. Logical OR (||)\r\n */\r\nexport function parse(tokens: Token[]): ASTNode {\r\n let current = 0;\r\n\r\n function walk(): ASTNode {\r\n return parseLogicalOr();\r\n }\r\n\r\n function parseLogicalOr(): ASTNode {\r\n let node = parseLogicalAnd();\r\n while (current < tokens.length && tokens[current].value === '||') {\r\n const operator = tokens[current].value as '||';\r\n current++;\r\n const right = parseLogicalAnd();\r\n node = { type: 'LogicalExpression', operator, left: node, right };\r\n }\r\n return node;\r\n }\r\n\r\n function parseLogicalAnd(): ASTNode {\r\n let node = parseComparison();\r\n while (current < tokens.length && tokens[current].value === '&&') {\r\n const operator = tokens[current].value as '&&';\r\n current++;\r\n const right = parseComparison();\r\n node = { type: 'LogicalExpression', operator, left: node, right };\r\n }\r\n return node;\r\n }\r\n\r\n function parseComparison(): ASTNode {\r\n let node = parseAdditive();\r\n const comparisonOps = ['==', '!=', '>', '>=', '<', '<='];\r\n while (current < tokens.length && comparisonOps.includes(tokens[current].value)) {\r\n const operator = tokens[current].value;\r\n current++;\r\n const right = parseAdditive();\r\n node = { type: 'BinaryExpression', operator, left: node, right };\r\n }\r\n return node;\r\n }\r\n\r\n function parseAdditive(): ASTNode {\r\n let node = parseMultiplicative();\r\n while (current < tokens.length && (tokens[current].value === '+' || tokens[current].value === '-')) {\r\n const operator = tokens[current].value;\r\n current++;\r\n const right = parseMultiplicative();\r\n node = { type: 'BinaryExpression', operator, left: node, right };\r\n }\r\n return node;\r\n }\r\n\r\n function parseMultiplicative(): ASTNode {\r\n let node = parseUnary();\r\n while (current < tokens.length && (tokens[current].value === '*' || tokens[current].value === '/' || tokens[current].value === '%')) {\r\n const operator = tokens[current].value;\r\n current++;\r\n const right = parseUnary();\r\n node = { type: 'BinaryExpression', operator, left: node, right };\r\n }\r\n return node;\r\n }\r\n\r\n function parseUnary(): ASTNode {\r\n if (current < tokens.length && tokens[current].value === '!') {\r\n current++;\r\n return { type: 'UnaryExpression', operator: '!', argument: parseUnary() };\r\n }\r\n return parsePrimary();\r\n }\r\n\r\n function parsePrimary(): ASTNode {\r\n const token = tokens[current];\r\n\r\n if (token.type === 'PAREN' && token.value === '(') {\r\n current++;\r\n const node = walk();\r\n if (tokens[current]?.value !== ')') {\r\n throw new Error('Expected )');\r\n }\r\n current++;\r\n return node;\r\n }\r\n\r\n if (token.type === 'IDENTIFIER') {\r\n current++;\r\n // 関数呼び出しのチェック: id(arg1, arg2)\r\n if (current < tokens.length && tokens[current].type === 'PAREN' && tokens[current].value === '(') {\r\n current++; // skip (\r\n const args: ASTNode[] = [];\r\n if (!(tokens[current].type === 'PAREN' && tokens[current].value === ')')) {\r\n while (true) {\r\n args.push(walk());\r\n if (tokens[current].type === 'COMMA') {\r\n current++;\r\n continue;\r\n }\r\n if (tokens[current].type === 'PAREN' && tokens[current].value === ')') {\r\n break;\r\n }\r\n throw new Error(`Expected , or ) in function call \"${token.value}\"`);\r\n }\r\n }\r\n current++; // skip )\r\n return { type: 'CallExpression', callee: token.value, arguments: args };\r\n }\r\n return { type: 'Identifier', name: token.value };\r\n }\r\n\r\n if (token.type === 'BRACKET' && token.value === '[') {\r\n current++; // skip [\r\n const elements: ASTNode[] = [];\r\n if (!(tokens[current].type === 'BRACKET' && tokens[current].value === ']')) {\r\n while (true) {\r\n elements.push(walk());\r\n if (tokens[current].type === 'COMMA') {\r\n current++;\r\n continue;\r\n }\r\n if (tokens[current].type === 'BRACKET' && tokens[current].value === ']') {\r\n break;\r\n }\r\n throw new Error('Expected , or ] in array literal');\r\n }\r\n }\r\n current++; // skip ]\r\n return { type: 'ArrayExpression', elements };\r\n }\r\n\r\n if (token.type === 'NUMBER') {\r\n current++;\r\n return { type: 'Literal', value: parseFloat(token.value) };\r\n }\r\n\r\n if (token.type === 'STRING') {\r\n current++;\r\n return { type: 'Literal', value: token.value };\r\n }\r\n\r\n if (token.type === 'BOOLEAN') {\r\n current++;\r\n return { type: 'Literal', value: token.value === 'true' };\r\n }\r\n\r\n throw new Error(`Unexpected token: ${token.value}`);\r\n }\r\n\r\n return walk();\r\n}\r\n","import { Token } from '../../types';\r\n\r\nexport function tokenize(input: string): Token[] {\r\n const tokens: Token[] = [];\r\n let current = 0;\r\n\r\n while (current < input.length) {\r\n let char = input[current];\r\n\r\n if (/\\s/.test(char)) {\r\n current++;\r\n continue;\r\n }\r\n\r\n if (char === '(' || char === ')') {\r\n tokens.push({ type: 'PAREN', value: char });\r\n current++;\r\n continue;\r\n }\r\n\r\n if (char === '[' || char === ']') {\r\n tokens.push({ type: 'BRACKET', value: char });\r\n current++;\r\n continue;\r\n }\r\n\r\n if (char === ',') {\r\n tokens.push({ type: 'COMMA', value: char });\r\n current++;\r\n continue;\r\n }\r\n\r\n if (char === '#' || char === '@') {\r\n const isRow = char === '@';\r\n let value = isRow ? '@' : '';\r\n current++; // skip # or @\r\n \r\n // @row.fieldName 対応\r\n if (isRow) {\r\n let rowPrefix = '';\r\n while (current < input.length && /[a-zA-Z0-9_-]/.test(input[current])) {\r\n rowPrefix += input[current];\r\n current++;\r\n }\r\n value += rowPrefix;\r\n if (input[current] === '.') {\r\n value += '.';\r\n current++;\r\n while (current < input.length && /[a-zA-Z0-9_-]/.test(input[current])) {\r\n value += input[current];\r\n current++;\r\n }\r\n }\r\n } else {\r\n while (current < input.length && /[a-zA-Z0-9_-]/.test(input[current])) {\r\n value += input[current];\r\n current++;\r\n }\r\n }\r\n tokens.push({ type: 'IDENTIFIER', value });\r\n continue;\r\n }\r\n\r\n if (/[0-9]/.test(char)) {\r\n let value = '';\r\n while (current < input.length && /[0-9.]/.test(input[current])) {\r\n value += input[current];\r\n current++;\r\n }\r\n tokens.push({ type: 'NUMBER', value });\r\n continue;\r\n }\r\n\r\n if (char === \"'\") {\r\n let value = '';\r\n current++; // skip '\r\n while (current < input.length && input[current] !== \"'\") {\r\n value += input[current];\r\n current++;\r\n }\r\n current++; // skip '\r\n tokens.push({ type: 'STRING', value });\r\n continue;\r\n }\r\n\r\n // Operators: ==, !=, &&, ||, !, >=, <=, >, <\r\n if (char === '=' && input[current + 1] === '=') {\r\n tokens.push({ type: 'OPERATOR', value: '==' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '!' && input[current + 1] === '=') {\r\n tokens.push({ type: 'OPERATOR', value: '!=' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '>' && input[current + 1] === '=') {\r\n tokens.push({ type: 'OPERATOR', value: '>=' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '<' && input[current + 1] === '=') {\r\n tokens.push({ type: 'OPERATOR', value: '<=' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '>') {\r\n tokens.push({ type: 'OPERATOR', value: '>' });\r\n current++;\r\n continue;\r\n }\r\n if (char === '<') {\r\n tokens.push({ type: 'OPERATOR', value: '<' });\r\n current++;\r\n continue;\r\n }\r\n if (char === '&' && input[current + 1] === '&') {\r\n tokens.push({ type: 'OPERATOR', value: '&&' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '|' && input[current + 1] === '|') {\r\n tokens.push({ type: 'OPERATOR', value: '||' });\r\n current += 2;\r\n continue;\r\n }\r\n if (char === '!') {\r\n tokens.push({ type: 'OPERATOR', value: '!' });\r\n current++;\r\n continue;\r\n }\r\n\r\n if (char === '+' || char === '-' || char === '*' || char === '/' || char === '%') {\r\n tokens.push({ type: 'OPERATOR', value: char });\r\n current++;\r\n continue;\r\n }\r\n\r\n // Identifiers (for functions like in, contains)\r\n const idMatch = input.slice(current).match(/^[a-zA-Z][a-zA-Z0-9_]*/);\r\n if (idMatch) {\r\n // boolean check already exists below, so we handle it here or let it fall through\r\n const word = idMatch[0];\r\n if (word === 'true' || word === 'false') {\r\n tokens.push({ type: 'BOOLEAN', value: word });\r\n current += word.length;\r\n } else {\r\n tokens.push({ type: 'IDENTIFIER', value: word });\r\n current += word.length;\r\n }\r\n continue;\r\n }\r\n\r\n throw new Error(`Unexpected character: ${char} at position ${current}`);\r\n }\r\n\r\n return tokens;\r\n}\r\n","import { ASTNode, DebugInfo, EffectType, EvaluationContext, FormFxOptions, FXValue, JSONEffect, JSONRule, Rule } from '../types';\r\nimport { applyClear, applyDisabled, applyRequired, applyShow } from './dom/effects';\r\nimport { findById } from './dom/select';\r\nimport { getInputValue } from './dom/value';\r\nimport { evaluate } from './expr/evaluator';\r\nimport { parse } from './expr/parser';\r\nimport { tokenize } from './expr/tokenizer';\r\n\r\nexport function createRules(formElement: HTMLElement, options: FormFxOptions = {}): Rule[] {\r\n const rules: Rule[] = [];\r\n \r\n // 1. attributes ルール\r\n const attributeTypes: EffectType[] = ['show', 'required', 'disabled', 'enable', 'clear'];\r\n\r\n attributeTypes.forEach(type => {\r\n const attrName = `data-fx-${type}`;\r\n const elements = formElement.querySelectorAll<HTMLElement>(`[${attrName}]`);\r\n \r\n elements.forEach(el => {\r\n const expression = el.getAttribute(attrName) || '';\r\n try {\r\n const tokens = tokenize(expression);\r\n const ast = parse(tokens);\r\n rules.push({\r\n element: el,\r\n type,\r\n expression,\r\n ast,\r\n source: 'attribute'\r\n });\r\n } catch (e) {\r\n console.warn(`[FormFx] Failed to parse expression \"${expression}\" for ${attrName}:`, e);\r\n }\r\n });\r\n });\r\n\r\n // 2. JSON rules\r\n if (options.rules) {\r\n options.rules.forEach(jsonRule => {\r\n try {\r\n const tokens = tokenize(jsonRule.if);\r\n const ast = parse(tokens);\r\n \r\n const addEffectRules = (effects: JSONEffect[], isElse: boolean) => {\r\n effects.forEach(effect => {\r\n Object.entries(effect).forEach(([key, selector]) => {\r\n if (typeof selector !== 'string' || !selector) return;\r\n let type = (key === 'require' ? 'required' : key) as EffectType;\r\n let expression = jsonRule.if;\r\n let finalAst = ast;\r\n\r\n if (type === 'hide') {\r\n type = 'show';\r\n finalAst = { type: 'UnaryExpression', operator: '!', argument: ast };\r\n expression = `!(${jsonRule.if})`;\r\n }\r\n\r\n if (isElse) {\r\n finalAst = { type: 'UnaryExpression', operator: '!', argument: finalAst };\r\n expression = `!(${expression})`;\r\n }\r\n\r\n const elements = formElement.querySelectorAll(selector);\r\n elements.forEach(node => {\r\n const el = node as HTMLElement;\r\n rules.push({\r\n id: jsonRule.id,\r\n element: el,\r\n type,\r\n expression,\r\n ast: finalAst,\r\n source: 'json',\r\n rawRule: jsonRule,\r\n disabled: jsonRule.disabled // v0.4\r\n });\r\n });\r\n });\r\n });\r\n };\r\n\r\n addEffectRules(jsonRule.then, false);\r\n if (jsonRule.else) {\r\n addEffectRules(jsonRule.else, true);\r\n }\r\n } catch (e) {\r\n console.warn(`[FormFx] Failed to parse JSON rule:`, jsonRule, e);\r\n }\r\n });\r\n }\r\n\r\n return rules;\r\n}\r\n\r\n/**\r\n * 依存しているフィールド(#id または @row.field)をASTから抽出する\r\n */\r\nexport function getDependencies(ast: ASTNode): { global: string[], row: string[] } {\r\n const global = new Set<string>();\r\n const row = new Set<string>();\r\n \r\n function traverse(node: ASTNode) {\r\n if (node.type === 'Identifier') {\r\n if (node.name.startsWith('@row.')) {\r\n row.add(node.name.substring(5));\r\n } else {\r\n global.add(node.name);\r\n }\r\n } else if (node.type === 'BinaryExpression' || node.type === 'LogicalExpression') {\r\n traverse(node.left);\r\n traverse(node.right);\r\n } else if (node.type === 'UnaryExpression') {\r\n traverse(node.argument);\r\n } else if (node.type === 'CallExpression') {\r\n node.arguments.forEach(traverse);\r\n } else if (node.type === 'ArrayExpression') {\r\n node.elements.forEach(traverse);\r\n }\r\n }\r\n \r\n traverse(ast);\r\n return {\r\n global: Array.from(global),\r\n row: Array.from(row)\r\n };\r\n}\r\n\r\nconst BUILTIN_FUNCTIONS: Record<string, (...args: any[]) => FXValue> = {\r\n in: (val, list) => {\r\n if (!Array.isArray(list)) return false;\r\n return list.includes(val);\r\n },\r\n contains: (val, sub) => {\r\n if (typeof val !== 'string') return false;\r\n return val.includes(sub);\r\n }\r\n};\r\n\r\nexport function runRules(formElement: HTMLElement, rules: Rule[], options: FormFxOptions): DebugInfo[] {\r\n const debugInfos: DebugInfo[] = [];\r\n // コンテキスト(値の辞書)を作成\r\n const globalContext: Record<string, FXValue> = {};\r\n \r\n // キャッシュして効率化することも考えられるが、まずは全ルール評価\r\n const allGlobalDeps = new Set<string>();\r\n rules.forEach(rule => {\r\n getDependencies(rule.ast).global.forEach(id => allGlobalDeps.add(id));\r\n });\r\n\r\n allGlobalDeps.forEach(id => {\r\n const el = findById(formElement, id);\r\n if (el) {\r\n globalContext[id] = getInputValue(el);\r\n } else {\r\n globalContext[id] = null;\r\n }\r\n });\r\n\r\n const baseEvalContext: EvaluationContext = {\r\n global: globalContext,\r\n functions: BUILTIN_FUNCTIONS\r\n };\r\n\r\n // 各ルールを評価して適用\r\n const elementToTypeToSource = new Map<HTMLElement, Map<EffectType, 'attribute' | 'json'>>();\r\n rules.forEach(rule => {\r\n if (!elementToTypeToSource.has(rule.element)) {\r\n elementToTypeToSource.set(rule.element, new Map());\r\n }\r\n const types = elementToTypeToSource.get(rule.element)!;\r\n // JSONが後にあるので、JSONがあれば上書きされる\r\n types.set(rule.type, rule.source);\r\n });\r\n\r\n rules.forEach(rule => {\r\n if (rule.disabled) return;\r\n\r\n // Determine if this rule should be skipped because a JSON rule for the same element and type exists.\r\n // JSON rules (added later in createRules) take precedence over attribute rules.\r\n if (rule.source === 'attribute') {\r\n const winner = elementToTypeToSource.get(rule.element)?.get(rule.type);\r\n if (winner === 'json') return;\r\n }\r\n\r\n try {\r\n // row context の構築\r\n let rowContext: Record<string, FXValue> | undefined = undefined;\r\n const rowItem = rule.element.closest('[data-fx-item]');\r\n if (rowItem) {\r\n rowContext = {};\r\n const deps = getDependencies(rule.ast);\r\n deps.row.forEach(fieldName => {\r\n const fieldEl = rowItem.querySelector(`[data-fx-field=\"${fieldName}\"]`);\r\n if (fieldEl) {\r\n // フィールド内の実際の入力要素を取得\r\n const input = fieldEl.querySelector('input, select, textarea') as HTMLElement;\r\n rowContext![fieldName] = input ? getInputValue(input) : null;\r\n } else {\r\n rowContext![fieldName] = null;\r\n }\r\n });\r\n }\r\n\r\n const evalContext: EvaluationContext = {\r\n ...baseEvalContext,\r\n row: rowContext\r\n };\r\n\r\n const result = evaluate(rule.ast, evalContext);\r\n const boolResult = !!result;\r\n\r\n if (options.debug) {\r\n debugInfos.push({\r\n rule,\r\n result: boolResult,\r\n elements: [rule.element]\r\n });\r\n console.debug(`[FormFx Debug] Rule: ${rule.type}=\"${rule.expression}\" (source: ${rule.source}, result: ${boolResult})`, {\r\n element: rule.element,\r\n result: boolResult,\r\n context: evalContext\r\n });\r\n }\r\n\r\n switch (rule.type) {\r\n case 'show':\r\n applyShow(rule.element, boolResult, options);\r\n break;\r\n case 'required':\r\n applyRequired(rule.element, boolResult);\r\n break;\r\n case 'disabled':\r\n applyDisabled(rule.element, boolResult);\r\n break;\r\n case 'enable':\r\n applyDisabled(rule.element, !boolResult);\r\n break;\r\n case 'clear':\r\n // 変化した瞬間(false -> true)のみクリア\r\n if (boolResult && rule.lastResult === false) {\r\n applyClear(rule.element);\r\n }\r\n break;\r\n }\r\n \r\n rule.lastResult = boolResult;\r\n\r\n } catch (e) {\r\n const errorMsg = e instanceof Error ? e.message : String(e);\r\n if (options.debug) {\r\n debugInfos.push({\r\n rule,\r\n result: 'error',\r\n error: errorMsg,\r\n elements: [rule.element]\r\n });\r\n console.warn(`[FormFx Debug] Evaluation failed: \"${rule.expression}\"`, e);\r\n } else {\r\n console.warn(`[FormFx] Failed to evaluate expression \"${rule.expression}\":`, e);\r\n }\r\n }\r\n });\r\n\r\n return debugInfos;\r\n}\r\n","export function setupEventListener(\r\n formElement: HTMLElement,\r\n callback: () => void,\r\n dependentIds: string[]\r\n): () => void {\r\n const handler = () => {\r\n callback();\r\n };\r\n\r\n // 依存フィールド単位での監視\r\n // ※ 動的に要素が追加される場合は MutationObserver がカバーする\r\n const cleanups: (() => void)[] = [];\r\n\r\n // 全体を監視しつつ、特定要素へのリスナーも検討可能だが、\r\n // シンプルさと確実性のために formElement への委譲を維持しつつ、\r\n // 将来的にはここで絞り込みを行う。\r\n // v0.2では「参照されているフィールドのみ」を意識した設計にする。\r\n \r\n formElement.addEventListener('input', handler);\r\n formElement.addEventListener('change', handler);\r\n\r\n return () => {\r\n formElement.removeEventListener('input', handler);\r\n formElement.removeEventListener('change', handler);\r\n };\r\n}\r\n\r\nexport function setupMutationObserver(\r\n formElement: HTMLElement,\r\n callback: () => void\r\n): MutationObserver {\r\n const observer = new MutationObserver((mutations) => {\r\n let shouldUpdate = false;\r\n for (const mutation of mutations) {\r\n if (mutation.type === 'childList' && (mutation.addedNodes.length > 0 || mutation.removedNodes.length > 0)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n \r\n if (shouldUpdate) {\r\n callback();\r\n }\r\n });\r\n\r\n observer.observe(formElement, {\r\n childList: true,\r\n subtree: true\r\n });\r\n\r\n return observer;\r\n}\r\n","import { RepeaterConfig } from '../../types';\r\n\r\nexport function setupRepeaters(\r\n formElement: HTMLElement,\r\n onUpdate: () => void\r\n): () => void {\r\n const repeaterElements = formElement.querySelectorAll<HTMLElement>('[data-fx-repeater]');\r\n const cleanups: (() => void)[] = [];\r\n\r\n repeaterElements.forEach(container => {\r\n const config: RepeaterConfig = {\r\n container,\r\n name: container.getAttribute('data-fx-name') || '',\r\n max: parseInt(container.getAttribute('data-fx-max') || '10', 10),\r\n addButton: container.querySelector<HTMLElement>('[data-fx-add]'),\r\n listContainer: container.querySelector<HTMLElement>('[data-fx-list]') || container,\r\n template: container.querySelector<HTMLTemplateElement>('template[data-fx-template]')!\r\n };\r\n\r\n if (!config.template) {\r\n console.warn('[FormFx] Repeater template not found', container);\r\n return;\r\n }\r\n\r\n const handleAdd = () => {\r\n const items = config.listContainer.querySelectorAll('[data-fx-item]');\r\n if (items.length < config.max) {\r\n addItem(config);\r\n reindex(config);\r\n onUpdate();\r\n }\r\n };\r\n\r\n if (config.addButton) {\r\n config.addButton.addEventListener('click', handleAdd);\r\n cleanups.push(() => config.addButton?.removeEventListener('click', handleAdd));\r\n }\r\n\r\n // 既存のアイテムに対してもイベント設定とリインデックスが必要\r\n const handleListClick = (e: Event) => {\r\n const target = e.target as HTMLElement;\r\n if (target.closest('[data-fx-remove]')) {\r\n const item = target.closest('[data-fx-item]');\r\n if (item) {\r\n item.remove();\r\n reindex(config);\r\n onUpdate();\r\n }\r\n }\r\n };\r\n\r\n config.listContainer.addEventListener('click', handleListClick);\r\n cleanups.push(() => config.listContainer.removeEventListener('click', handleListClick));\r\n\r\n // 初期化時に一度リインデックス\r\n reindex(config);\r\n });\r\n\r\n return () => cleanups.forEach(c => c());\r\n}\r\n\r\nfunction addItem(config: RepeaterConfig) {\r\n const content = config.template.content.cloneNode(true) as DocumentFragment;\r\n const item = content.querySelector('[data-fx-item]');\r\n if (item) {\r\n config.listContainer.appendChild(item);\r\n }\r\n}\r\n\r\nfunction reindex(config: RepeaterConfig) {\r\n const items = config.listContainer.querySelectorAll<HTMLElement>('[data-fx-item]');\r\n items.forEach((item, index) => {\r\n // data-fx-index 属性を付与(デバッグや特定用途向け)\r\n item.setAttribute('data-fx-index', index.toString());\r\n\r\n const fields = item.querySelectorAll<HTMLElement>('[data-fx-field]');\r\n fields.forEach(field => {\r\n const fieldName = field.getAttribute('data-fx-field');\r\n if (fieldName) {\r\n const inputs = field.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>('input, select, textarea');\r\n inputs.forEach(input => {\r\n input.name = `${config.name}[${index}].${fieldName}`;\r\n // 行内参照を容易にするため、input自体にも field 名を保持させることがあるが、\r\n // 今回は closest('[data-fx-field]') で解決する設計とした。\r\n });\r\n }\r\n });\r\n });\r\n\r\n // 追加ボタンの表示/非表示制御(任意だが親切)\r\n if (config.addButton) {\r\n if (items.length >= config.max) {\r\n config.addButton.style.display = 'none';\r\n } else {\r\n config.addButton.style.display = '';\r\n }\r\n }\r\n}\r\n","import { DebugInfo, PersistOptions } from '../../types';\r\n\r\nexport class DebugPanel {\r\n private container: HTMLElement | null = null;\r\n private shadow: ShadowRoot | null = null;\r\n private persistInfo: PersistOptions | null = null;\r\n private isMinimized = false;\r\n private pos = { x: 10, y: 10 };\r\n private isDragging = false;\r\n private dragStart = { x: 0, y: 0 };\r\n\r\n constructor() {\r\n this.loadState();\r\n this.container = document.createElement('div');\r\n this.container.id = 'formfx-debug-panel';\r\n this.shadow = this.container.attachShadow({ mode: 'open' });\r\n this.renderInitial();\r\n document.body.appendChild(this.container);\r\n this.setupDragging();\r\n }\r\n\r\n private loadState() {\r\n try {\r\n const saved = localStorage.getItem('formfx-debug-state');\r\n if (saved) {\r\n const state = JSON.parse(saved);\r\n this.isMinimized = !!state.isMinimized;\r\n if (state.pos) this.pos = state.pos;\r\n }\r\n } catch (e) {\r\n // Ignore\r\n }\r\n }\r\n\r\n private saveState() {\r\n try {\r\n localStorage.setItem('formfx-debug-state', JSON.stringify({\r\n isMinimized: this.isMinimized,\r\n pos: this.pos\r\n }));\r\n } catch (e) {\r\n // Ignore\r\n }\r\n }\r\n\r\n private setupDragging() {\r\n if (!this.shadow || !this.container) return;\r\n const header = this.shadow.querySelector('.header') as HTMLElement;\r\n if (!header) return;\r\n\r\n header.style.cursor = 'move';\r\n header.addEventListener('mousedown', (e) => {\r\n this.isDragging = true;\r\n this.dragStart = {\r\n x: e.clientX + this.pos.x,\r\n y: e.clientY + this.pos.y\r\n };\r\n e.preventDefault();\r\n });\r\n\r\n window.addEventListener('mousemove', (e) => {\r\n if (!this.isDragging) return;\r\n this.pos.x = this.dragStart.x - e.clientX;\r\n this.pos.y = this.dragStart.y - e.clientY;\r\n this.updatePosition();\r\n });\r\n\r\n window.addEventListener('mouseup', () => {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n this.saveState();\r\n }\r\n });\r\n\r\n const toggleBtn = this.shadow.getElementById('toggle-minimize');\r\n toggleBtn?.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.isMinimized = !this.isMinimized;\r\n this.renderInitial();\r\n this.updatePosition();\r\n this.saveState();\r\n });\r\n }\r\n\r\n private updatePosition() {\r\n if (!this.container) return;\r\n this.container.style.bottom = `${this.pos.y}px`;\r\n this.container.style.right = `${this.pos.x}px`;\r\n }\r\n\r\n setPersistInfo(info: PersistOptions) {\r\n this.persistInfo = info;\r\n }\r\n\r\n private renderInitial() {\r\n if (!this.shadow) return;\r\n this.shadow.innerHTML = `\r\n <style>\r\n :host {\r\n position: fixed;\r\n bottom: ${this.pos.y}px;\r\n right: ${this.pos.x}px;\r\n width: 350px;\r\n max-height: 80vh;\r\n background: rgba(0, 0, 0, 0.85);\r\n color: white;\r\n font-family: monospace;\r\n font-size: 12px;\r\n border-radius: 8px;\r\n overflow: hidden;\r\n z-index: 10000;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\r\n border: 1px solid #444;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .header {\r\n padding: 8px 12px;\r\n background: #222;\r\n border-bottom: 1px solid #444;\r\n font-weight: bold;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n user-select: none;\r\n }\r\n .content {\r\n padding: 8px;\r\n overflow-y: auto;\r\n display: ${this.isMinimized ? 'none' : 'block'};\r\n }\r\n .header-controls {\r\n display: flex;\r\n gap: 8px;\r\n }\r\n .btn-icon {\r\n cursor: pointer;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n background: #444;\r\n border: none;\r\n color: white;\r\n font-size: 10px;\r\n }\r\n .btn-icon:hover {\r\n background: #666;\r\n }\r\n .rule {\r\n margin-bottom: 8px;\r\n padding: 6px;\r\n border-radius: 4px;\r\n background: #333;\r\n }\r\n .rule-header {\r\n display: flex;\r\n justify-content: space-between;\r\n margin-bottom: 4px;\r\n }\r\n .rule-id {\r\n color: #aaa;\r\n font-size: 10px;\r\n }\r\n .rule-expr {\r\n word-break: break-all;\r\n color: #88ccff;\r\n }\r\n .status {\r\n font-weight: bold;\r\n padding: 2px 4px;\r\n border-radius: 2px;\r\n font-size: 10px;\r\n }\r\n .status-true { background: #228b22; }\r\n .status-false { background: #b22222; }\r\n .status-error { background: #ff4500; }\r\n .status-disabled { background: #666; color: #ccc; }\r\n .persist-badge {\r\n font-size: 9px;\r\n background: #444;\r\n padding: 1px 4px;\r\n border-radius: 4px;\r\n color: #00ff00;\r\n border: 1px solid #00ff00;\r\n }\r\n .header-top {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n .effects {\r\n margin-top: 4px;\r\n padding-left: 12px;\r\n border-left: 2px solid #555;\r\n font-size: 11px;\r\n }\r\n .effect-item {\r\n margin-top: 2px;\r\n }\r\n .effect-skipped {\r\n color: #888;\r\n text-decoration: line-through;\r\n }\r\n .error-msg {\r\n color: #ff6347;\r\n font-size: 10px;\r\n margin-top: 4px;\r\n }\r\n </style>\r\n <div class=\"header\">\r\n <div class=\"header-top\">\r\n <span>FormFx Debug</span>\r\n ${this.persistInfo ? `<span class=\"persist-badge\">PERSIST</span>` : ''}\r\n </div>\r\n <div class=\"header-controls\">\r\n <button id=\"toggle-minimize\" class=\"btn-icon\">${this.isMinimized ? '□' : '_'} </button>\r\n </div>\r\n </div>\r\n <div id=\"rule-list\" class=\"content\">\r\n Waiting for evaluation...\r\n </div>\r\n `;\r\n this.setupDragging();\r\n }\r\n\r\n update(debugInfos: DebugInfo[]) {\r\n if (!this.shadow) return;\r\n const listEl = this.shadow.getElementById('rule-list');\r\n if (!listEl) return;\r\n\r\n listEl.innerHTML = debugInfos.map(info => {\r\n const { rule, result, error } = info;\r\n \r\n let statusClass = result === 'error' ? 'status-error' : (result ? 'status-true' : 'status-false');\r\n let statusText = result === 'error' ? 'ERROR' : result.toString().toUpperCase();\r\n\r\n if (rule.disabled) {\r\n statusClass = 'status-disabled';\r\n statusText = 'DISABLED';\r\n }\r\n \r\n let effectInfo = `${rule.type} ${this.getSelector(rule.element)}`;\r\n if (result !== true && result !== 'error' && !rule.disabled) {\r\n effectInfo = `<span class=\"effect-skipped\">${effectInfo} (skipped)</span>`;\r\n }\r\n if (rule.disabled) {\r\n effectInfo = `<span class=\"effect-skipped\">${effectInfo}</span>`;\r\n }\r\n\r\n return `\r\n <div class=\"rule\">\r\n <div class=\"rule-header\">\r\n <span class=\"rule-id\">${rule.id || (rule.source === 'attribute' ? 'Attr' : 'JSON')}</span>\r\n <span class=\"status ${statusClass}\">${statusText}</span>\r\n </div>\r\n <div class=\"rule-expr\">${rule.expression}</div>\r\n <div class=\"effects\">\r\n <div class=\"effect-item\">${effectInfo}</div>\r\n </div>\r\n ${error ? `<div class=\"error-msg\">Error: ${error}</div>` : ''}\r\n </div>\r\n `;\r\n }).join('');\r\n }\r\n\r\n private getSelector(el: HTMLElement): string {\r\n if (el.id) return `#${el.id}`;\r\n if (el.className) return `.${el.className.split(' ').join('.')}`;\r\n return el.tagName.toLowerCase();\r\n }\r\n\r\n destroy() {\r\n if (this.container && this.container.parentNode) {\r\n this.container.parentNode.removeChild(this.container);\r\n }\r\n }\r\n}\r\n","import { FormFxOptions, Rule, JSONRule, RuleEditorOptions } from '../types';\r\nimport { createRules, runRules, getDependencies } from '../internal/engine';\r\nimport { setupEventListener, setupMutationObserver } from '../internal/observe';\r\nimport { setupRepeaters } from '../plugins/repeater';\r\nimport { DebugPanel } from '../internal/debug/panel';\r\n\r\nexport class FormFx {\r\n private rules: Rule[] = [];\r\n private options: FormFxOptions;\r\n private cleanupEvents: (() => void) | null = null;\r\n private cleanupRepeaters: (() => void) | null = null;\r\n private observer: MutationObserver | null = null;\r\n private debugPanel: DebugPanel | null = null;\r\n private isPaused = false;\r\n\r\n constructor(private formElement: HTMLElement, options: FormFxOptions = {}) {\r\n this.options = {\r\n disableOnHide: true,\r\n clearOnHide: false,\r\n ...options\r\n };\r\n\r\n // 永続化データの読み込み (JSON rulesのみ)\r\n this.loadPersistedRules();\r\n }\r\n\r\n mount(): void {\r\n // 0. Debug Panel の初期化\r\n if (this.options.debug) {\r\n this.debugPanel = new DebugPanel();\r\n if (this.options.persist) {\r\n this.debugPanel.setPersistInfo(this.options.persist);\r\n }\r\n }\r\n\r\n // 1. ルールの初回収集\r\n this.refreshRules();\r\n\r\n // 2. リピーターの初期化\r\n this.cleanupRepeaters = setupRepeaters(this.formElement, () => {\r\n // DOMが変化した後にルールを再収集して評価\r\n this.refreshRules();\r\n this.setupEvents(); // 依存フィールドが変わる可能性があるため再設定\r\n this.evaluate();\r\n });\r\n\r\n // 3. イベントリスナーの設定\r\n this.setupEvents();\r\n\r\n // 4. MutationObserverの設定(動的な属性追加などに対応)\r\n this.observer = setupMutationObserver(this.formElement, () => {\r\n this.refreshRules();\r\n this.setupEvents();\r\n this.evaluate();\r\n });\r\n\r\n // 5. 初回評価\r\n this.evaluate();\r\n }\r\n\r\n reEvaluate(): void {\r\n this.evaluate();\r\n }\r\n\r\n private setupEvents(): void {\r\n if (this.cleanupEvents) this.cleanupEvents();\r\n\r\n const dependentIds = new Set<string>();\r\n this.rules.forEach(rule => {\r\n getDependencies(rule.ast).global.forEach(id => {\r\n // IDだけでなくnameでも参照される可能性があるため、基本的には広めに監視する\r\n dependentIds.add(id);\r\n });\r\n });\r\n\r\n this.cleanupEvents = setupEventListener(this.formElement, () => {\r\n this.evaluate();\r\n }, Array.from(dependentIds));\r\n }\r\n\r\n private refreshRules(): void {\r\n // attributes ルールと JSON ルールの両方を収集\r\n // JSON rules が優先されるように後でマージするが、\r\n // createRules 内で JSON rules は後に追加されるように実装済み\r\n this.rules = createRules(this.formElement, this.options);\r\n }\r\n\r\n private evaluate(): void {\r\n if (this.isPaused) return;\r\n\r\n const debugInfos = runRules(this.formElement, this.rules, this.options);\r\n if (this.debugPanel) {\r\n this.debugPanel.update(debugInfos);\r\n }\r\n }\r\n\r\n /**\r\n * ルール評価を一時停止する (v0.4)\r\n */\r\n pause(): void {\r\n this.isPaused = true;\r\n }\r\n\r\n /**\r\n * ルール評価を再開する (v0.4)\r\n */\r\n resume(): void {\r\n this.isPaused = false;\r\n this.evaluate();\r\n }\r\n\r\n /**\r\n * JSONルールをエクスポートする (v0.4)\r\n */\r\n exportRules(): JSONRule[] {\r\n return this.options.rules || [];\r\n }\r\n\r\n /**\r\n * JSONルールをインポートする (v0.4)\r\n */\r\n importRules(rules: JSONRule[]): void {\r\n this.options.rules = rules;\r\n this.savePersistedRules();\r\n this.refreshRules();\r\n this.setupEvents();\r\n this.evaluate();\r\n }\r\n\r\n /**\r\n * Rule Editor を有効化する (v0.4)\r\n */\r\n async enableRuleEditor(options: RuleEditorOptions): Promise<void> {\r\n const { RuleEditor } = await import('../editor/RuleEditor');\r\n const editor = new RuleEditor(this, options);\r\n editor.mount();\r\n }\r\n\r\n private loadPersistedRules(): void {\r\n const { persist } = this.options;\r\n if (!persist) return;\r\n\r\n try {\r\n const storage = persist.storage === 'localStorage' ? localStorage : sessionStorage;\r\n const data = storage.getItem(persist.key);\r\n if (data) {\r\n this.options.rules = JSON.parse(data);\r\n }\r\n } catch (e) {\r\n console.error('[FormFx] Failed to load persisted rules:', e);\r\n }\r\n }\r\n\r\n private savePersistedRules(): void {\r\n const { persist, rules } = this.options;\r\n if (!persist || !rules) return;\r\n\r\n try {\r\n const storage = persist.storage === 'localStorage' ? localStorage : sessionStorage;\r\n storage.setItem(persist.key, JSON.stringify(rules));\r\n } catch (e) {\r\n console.error('[FormFx] Failed to save rules:', e);\r\n }\r\n }\r\n\r\n /**\r\n * JSONルールを有効化する\r\n * @param ruleId \r\n */\r\n enableRule(ruleId: string): void {\r\n this.rules.forEach(r => {\r\n if (r.id === ruleId && r.source === 'json') {\r\n r.disabled = false;\r\n }\r\n });\r\n if (this.options.rules) {\r\n this.options.rules.forEach(r => {\r\n if (r.id === ruleId) r.disabled = false;\r\n });\r\n this.savePersistedRules();\r\n }\r\n this.evaluate();\r\n }\r\n\r\n /**\r\n * JSONルールを無効化する\r\n * @param ruleId \r\n */\r\n disableRule(ruleId: string): void {\r\n this.rules.forEach(r => {\r\n if (r.id === ruleId && r.source === 'json') {\r\n r.disabled = true;\r\n }\r\n });\r\n if (this.options.rules) {\r\n this.options.rules.forEach(r => {\r\n if (r.id === ruleId) r.disabled = true;\r\n });\r\n this.savePersistedRules();\r\n }\r\n this.evaluate();\r\n }\r\n\r\n destroy(): void {\r\n if (this.cleanupEvents) this.cleanupEvents();\r\n if (this.cleanupRepeaters) this.cleanupRepeaters();\r\n if (this.observer) this.observer.disconnect();\r\n if (this.debugPanel) this.debugPanel.destroy();\r\n \r\n // イベントリスナーの再解除を確実にするため\r\n this.cleanupEvents = null;\r\n this.cleanupRepeaters = null;\r\n this.observer = null;\r\n this.debugPanel = null;\r\n\r\n // 適用されたスタイルや属性をリセットしたい場合があるが、\r\n // 基本的には「監視を止める」のが destroy の責務\r\n this.rules = [];\r\n }\r\n}\r\n"]}
|