@hyperfixi/vite-plugin 3.3.0 → 4.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/README.md +100 -95
- package/dist/index.cjs +244 -1856
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +36 -130
- package/dist/index.d.ts +36 -130
- package/dist/index.js +243 -1863
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/scanner.ts","../src/language-keywords.ts","../src/htmx-localized-attrs.ts","../src/aggregator.ts","../src/generator.ts","../src/semantic-integration.ts","../src/compiler.ts","../src/compiled-generator.ts","../src/html-transformer.ts","../src/server-bridge-integration.ts","../src/domain-scanner.ts","../src/domain-aggregator.ts","../src/index.ts"],"sourcesContent":["/**\n * Scanner\n *\n * Detects hyperscript usage in source files by scanning for _=\"...\" attributes.\n * Also detects non-English language keywords for multilingual semantic support.\n */\n\nimport { AVAILABLE_COMMANDS, FULL_RUNTIME_ONLY_COMMANDS } from '@hyperfixi/core/bundle-generator';\nimport type { FileUsage, HyperfixiPluginOptions, HtmxUsage } from './types';\nimport { detectLanguages } from './language-keywords';\nimport { buildLocalizedHxLivePattern, SSE_NS_PATTERN, WS_NS_PATTERN } from './htmx-localized-attrs';\n\n/**\n * Command-detection pattern, derived from core's bundle-generator capability\n * lists instead of a hand-maintained duplicate (which had silently drifted:\n * `empty` was added to core without ever reaching the old hardcoded regex, so\n * projects using it got bundles without it). Hyphenated names (push-url,\n * replace-url, process-partials) are excluded: their hyperscript surface forms\n * are the space-separated `push url …` / `replace url …`, whose heads `push` /\n * `replace` are already in the list. Full-runtime-only names are included so\n * their use routes bundle selection to a tier that actually supports them; a\n * false positive only costs bundle size, never correctness.\n */\nconst SCANNABLE_COMMANDS = [\n ...new Set<string>([...AVAILABLE_COMMANDS, ...FULL_RUNTIME_ONLY_COMMANDS]),\n].filter(\n cmd =>\n /^[A-Za-z]+$/.test(cmd) &&\n // `unless` is handled by the block detection below (it compiles to the\n // lite-capable `if` block — flagging it as a full-runtime-only COMMAND\n // would needlessly bump every unless-user to a full-runtime bundle).\n // `bind` is handled by the dedicated reactivity detection below, which\n // routes to the hx-v4 bundle (the tier that actually ships reactivity).\n cmd !== 'unless' &&\n cmd !== 'bind'\n);\n\nconst COMMAND_PATTERN_SOURCE = `\\\\b(${SCANNABLE_COMMANDS.join('|')})\\\\b`;\n\n// htmx/fixi attribute patterns\nconst HTMX_REQUEST_PATTERN =\n /\\b(hx-get|hx-post|hx-put|hx-patch|hx-delete)\\s*=\\s*[\"']([^\"']+)[\"']/gi;\nconst FIXI_ACTION_PATTERN = /\\bfx-action\\s*=\\s*[\"']([^\"']+)[\"']/gi;\nconst FIXI_METHOD_PATTERN = /\\bfx-method\\s*=\\s*[\"'](GET|POST|PUT|PATCH|DELETE)[\"']/gi;\nconst HTMX_SWAP_PATTERN = /\\b(hx-swap|fx-swap)\\s*=\\s*[\"']([^\"']+)[\"']/gi;\nconst HTMX_TARGET_PATTERN = /\\b(hx-target|fx-target)\\s*=\\s*[\"']([^\"']+)[\"']/gi;\nconst HTMX_TRIGGER_PATTERN = /\\b(hx-trigger|fx-trigger)\\s*=\\s*[\"']([^\"']+)[\"']/gi;\nconst HTMX_URL_PATTERN = /\\b(hx-push-url|hx-replace-url)\\s*=\\s*[\"'][^\"']+[\"']/gi;\nconst HTMX_CONFIRM_PATTERN = /\\bhx-confirm\\s*=\\s*[\"']/gi;\nconst HTMX_ON_PATTERN = /\\bhx-on:(\\w+)\\s*=\\s*[\"']([^\"']+)[\"']/g;\n\n// htmx v4 reactive/streaming surface (English-form attributes).\nconst HX_LIVE_PATTERN = /\\bhx-live\\s*=\\s*[\"']/i;\nconst SSE_CONNECT_PATTERN = /\\bsse-connect\\s*=\\s*[\"']/i;\nconst SSE_SWAP_PATTERN = /\\bsse-swap\\s*=\\s*[\"']/i;\nconst WS_CONNECT_PATTERN = /\\bws-connect\\s*=\\s*[\"']/i;\nconst WS_SEND_PATTERN = /\\bws-send(\\s*=\\s*[\"']|\\b)/i;\n\n// Localized v4 attribute patterns (see ./htmx-localized-attrs.ts).\n// Built once at module load so the regex's literal-set is fixed.\nconst HX_LIVE_LOCALIZED_PATTERN = buildLocalizedHxLivePattern();\n\n/**\n * Phase 8: localized htmx-compat attribute names. Vocab modules under\n * `packages/core/vocab/htmx/` emit per-language maps like\n * `hx-obtener` (es) → `hx-get`\n * `hx-取得` (ja) → `hx-get`\n * `sse-conectar`(es) → `sse-connect`\n *\n * The scanner needs to recognize these so projects authoring in\n * Spanish/Japanese/etc. still get the htmx-compat bundle. The pattern\n * matches `hx-`/`sse-`/`ws-` followed by any identifier characters\n * (including Unicode), which covers both English and localized forms.\n * Bare `hx-` / `sse-` / `ws-` (with no suffix) and English forms\n * already matched by the named patterns above contribute too — the\n * generic match is a superset.\n */\nconst LOCALIZED_HX_PATTERN = /\\b(hx|sse|ws)-[\\w\\-\\p{L}]+\\s*=\\s*[\"']/u;\n\n/**\n * `bind <var> to <expr>.<property>` inside `_=` bodies. Matches both the\n * default `$var` form and possessive (`me's value`) syntax. The trailing\n * `.<ident>` is what makes this \"explicit property\" bind — it's also\n * possible to write `bind $x to <element>` without a property, but that\n * path is the auto-detect form and doesn't itself signal \"needs the\n * Phase 1 bind-to-property addition\" beyond what plain reactivity needs.\n */\nconst BIND_TO_PROPERTY_PATTERN = /\\bbind\\s+\\S+\\s+to\\s+\\S+\\.\\w+/i;\n\n/**\n * Converts include/exclude options to RegExp\n */\nfunction toRegex(pattern: RegExp | string[] | undefined, defaultPattern: RegExp): RegExp {\n if (!pattern) return defaultPattern;\n if (pattern instanceof RegExp) return pattern;\n if (Array.isArray(pattern)) {\n const escaped = pattern.map(p => p.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n return new RegExp(`(${escaped.join('|')})`);\n }\n return defaultPattern;\n}\n\n/**\n * Scanner class for detecting hyperscript usage in files\n */\nexport class Scanner {\n private include: RegExp;\n private exclude: RegExp;\n private debug: boolean;\n\n constructor(options: Pick<HyperfixiPluginOptions, 'include' | 'exclude' | 'debug'>) {\n this.include = toRegex(\n options.include,\n /\\.(html?|vue|svelte|jsx?|tsx?|astro|php|erb|ejs|hbs|handlebars)$/\n );\n this.exclude = toRegex(options.exclude, /node_modules|\\.git/);\n this.debug = options.debug ?? false;\n }\n\n /**\n * Check if a file should be scanned\n */\n shouldScan(id: string): boolean {\n return this.include.test(id) && !this.exclude.test(id);\n }\n\n /**\n * Scan code for hyperscript usage\n */\n scan(code: string, id: string): FileUsage {\n const usage: FileUsage = {\n commands: new Set(),\n blocks: new Set(),\n positional: false,\n detectedLanguages: new Set(),\n needsReactivity: false,\n needsBindToProperty: false,\n };\n\n // Find all hyperscript in _=\"...\" attributes (single, double, backtick quotes)\n const attrPatterns = [\n /_\\s*=\\s*\"([^\"]+)\"/g, // _=\"...\"\n /_\\s*=\\s*'([^']+)'/g, // _='...'\n /_\\s*=\\s*`([^`]+)`/g, // _=`...`\n /_=\\{`([^`]+)`\\}/g, // _={`...`} (JSX)\n /_=\\{['\"]([^'\"]+)['\"]\\}/g, // _={\"...\"} or _={'...'} (JSX)\n ];\n\n for (const pattern of attrPatterns) {\n let match;\n while ((match = pattern.exec(code))) {\n this.analyzeScript(match[1], usage);\n }\n }\n\n // Also check for hyperscript in script tags\n const scriptPattern = /<script[^>]*type=[\"']?text\\/hyperscript[\"']?[^>]*>([^<]+)<\\/script>/gi;\n let match;\n while ((match = scriptPattern.exec(code))) {\n this.analyzeScript(match[1], usage);\n }\n\n // Scan for htmx/fixi attributes\n const htmxUsage = this.scanHtmxAttributes(code);\n\n if (htmxUsage.hasHtmxAttributes) {\n usage.htmx = htmxUsage;\n this.inferCommandsFromHtmx(htmxUsage, usage);\n\n // Scan hx-on:* handler values as hyperscript\n for (const handlerCode of htmxUsage.onHandlers) {\n this.analyzeScript(handlerCode, usage);\n }\n\n // Check hx-target for positional patterns\n if (/hx-target\\s*=\\s*[\"'](closest|next|previous|find)\\s/i.test(code)) {\n usage.positional = true;\n }\n\n // Roll htmx-attribute-driven reactivity flags up to the top level so\n // the aggregator and generator only have to consult one place.\n if (htmxUsage.needsReactivity) usage.needsReactivity = true;\n }\n\n if (\n this.debug &&\n (usage.commands.size > 0 ||\n usage.blocks.size > 0 ||\n usage.detectedLanguages.size > 0 ||\n usage.htmx?.hasHtmxAttributes)\n ) {\n console.log(`[hyperfixi] Scanned ${id}:`, {\n commands: [...usage.commands],\n blocks: [...usage.blocks],\n positional: usage.positional,\n languages: [...usage.detectedLanguages],\n htmx: usage.htmx\n ? {\n hasHtmxAttributes: usage.htmx.hasHtmxAttributes,\n hasFixiAttributes: usage.htmx.hasFixiAttributes,\n httpMethods: [...usage.htmx.httpMethods],\n swapStrategies: [...usage.htmx.swapStrategies],\n }\n : undefined,\n });\n }\n\n return usage;\n }\n\n /**\n * Analyze a hyperscript snippet for commands, blocks, and expressions\n */\n private analyzeScript(script: string, usage: FileUsage): void {\n // Detect commands (list derived from core — see SCANNABLE_COMMANDS above)\n const commandPattern = new RegExp(COMMAND_PATTERN_SOURCE, 'g');\n let match;\n while ((match = commandPattern.exec(script))) {\n usage.commands.add(match[1]);\n }\n\n // Detect blocks\n if (/\\bif\\b/.test(script)) usage.blocks.add('if');\n if (/\\bunless\\b/.test(script)) usage.blocks.add('if'); // unless uses same block as if\n // repeat pattern: handles literals, :localVars, $globalVars, and identifiers\n if (/\\brepeat\\s+(\\d+|:\\w+|\\$\\w+|[\\w.]+)\\s+times?\\b/i.test(script)) usage.blocks.add('repeat');\n if (/\\bfor\\s+(each|every)\\b/i.test(script)) usage.blocks.add('for');\n if (/\\bwhile\\b/.test(script)) usage.blocks.add('while');\n if (/\\bfetch\\b/.test(script)) usage.blocks.add('fetch');\n\n // Detect positional expressions\n if (/\\b(first|last|next|previous|closest|parent)\\b/.test(script)) {\n usage.positional = true;\n }\n\n // Detect non-English languages for multilingual semantic support\n const languages = detectLanguages(script);\n for (const lang of languages) {\n usage.detectedLanguages.add(lang);\n }\n\n // Reactivity features inside `_=` bodies. `live`, `when`, and `bind` are\n // top-level features from `@hyperfixi/reactivity`. Their `^var` form\n // (DOM-scoped inherited globals) also implies reactivity.\n if (\n /\\blive\\b/.test(script) ||\n /\\bwhen\\s+\\S+\\s+changes\\b/i.test(script) ||\n /\\bbind\\b/.test(script) ||\n /\\^\\w/.test(script)\n ) {\n usage.needsReactivity = true;\n }\n // Explicit-property bind specifically: `bind <var> to <expr>.<prop>`.\n // Implies reactivity too — the auto-detect form already set it above.\n if (BIND_TO_PROPERTY_PATTERN.test(script)) {\n usage.needsBindToProperty = true;\n usage.needsReactivity = true;\n }\n }\n\n /**\n * Scan for htmx/fixi attributes\n */\n private scanHtmxAttributes(code: string): HtmxUsage {\n const usage: HtmxUsage = {\n hasHtmxAttributes: false,\n hasFixiAttributes: false,\n httpMethods: new Set(),\n swapStrategies: new Set(),\n onHandlers: [],\n triggerModifiers: new Set(),\n urlManagement: new Set(),\n usesConfirm: false,\n needsSwapTiming: false,\n needsHxLive: false,\n needsSSE: false,\n needsWS: false,\n needsBindToProperty: false,\n needsReactivity: false,\n };\n\n // Detect hx-get/post/put/patch/delete\n let match;\n const requestPattern = new RegExp(HTMX_REQUEST_PATTERN.source, 'gi');\n while ((match = requestPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n usage.httpMethods.add(match[1].replace('hx-', '').toUpperCase());\n }\n\n // Detect fx-action\n if (new RegExp(FIXI_ACTION_PATTERN.source, 'gi').test(code)) {\n usage.hasHtmxAttributes = true;\n usage.hasFixiAttributes = true;\n }\n\n // Detect fx-method\n const fixiMethodPattern = new RegExp(FIXI_METHOD_PATTERN.source, 'gi');\n while ((match = fixiMethodPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n usage.hasFixiAttributes = true;\n usage.httpMethods.add(match[1].toUpperCase());\n }\n\n // Detect swap strategies. `hx-swap` is a head style token followed by HCON\n // modifiers, so the first token is only a style when it isn't a `key:value`\n // pair — otherwise `hx-swap=\"swap:200ms\"` would register `swap:200ms` as a\n // strategy. `morph:innerHTML` is the exception: a style that looks like a pair.\n const swapPattern = new RegExp(HTMX_SWAP_PATTERN.source, 'gi');\n while ((match = swapPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n\n const spec = match[2].trim();\n const head = spec.split(/\\s+/)[0];\n if (head.startsWith('morph') || !/^\\S*:/.test(spec)) {\n usage.swapStrategies.add(head);\n }\n\n // `swap:`/`settle:` timings compile to `wait <n>ms`.\n if (/\\b(swap|settle):/.test(spec)) {\n usage.needsSwapTiming = true;\n }\n }\n\n // Detect trigger modifiers\n const triggerPattern = new RegExp(HTMX_TRIGGER_PATTERN.source, 'gi');\n while ((match = triggerPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n const trigger = match[2];\n if (/delay:/i.test(trigger)) usage.triggerModifiers.add('debounce');\n if (/throttle:/i.test(trigger)) usage.triggerModifiers.add('throttle');\n if (/\\bonce\\b/i.test(trigger)) usage.triggerModifiers.add('once');\n }\n\n // Detect URL management\n if (new RegExp(HTMX_URL_PATTERN.source, 'gi').test(code)) {\n usage.hasHtmxAttributes = true;\n if (/hx-push-url/i.test(code)) usage.urlManagement.add('push-url');\n if (/hx-replace-url/i.test(code)) usage.urlManagement.add('replace-url');\n }\n\n // Detect hx-confirm\n if (new RegExp(HTMX_CONFIRM_PATTERN.source, 'gi').test(code)) {\n usage.hasHtmxAttributes = true;\n usage.usesConfirm = true;\n }\n\n // Detect hx-on:* handlers\n const onPattern = new RegExp(HTMX_ON_PATTERN.source, 'g');\n while ((match = onPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n usage.onHandlers.push(match[2]);\n }\n\n // Check hx-target for positional patterns\n const targetPattern = new RegExp(HTMX_TARGET_PATTERN.source, 'gi');\n while ((match = targetPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n }\n\n // htmx v4 reactive / streaming surface — English-form attributes.\n if (HX_LIVE_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsHxLive = true;\n usage.needsReactivity = true;\n }\n if (SSE_CONNECT_PATTERN.test(code) || SSE_SWAP_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsSSE = true;\n }\n if (WS_CONNECT_PATTERN.test(code) || WS_SEND_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsWS = true;\n }\n\n // Phase 8: localized v4 attribute names. Authors writing Spanish\n // (`hx-en-vivo`, `sse-conectar`, `ws-conectar`), Japanese\n // (`hx-ライブ`, `sse-接続`), etc. need the same feature flags so\n // the generator routes them to the hx-v4 bundle (which ships the\n // orchestrator + vocab discovery path the slim bundles lack).\n //\n // SSE/WS use namespace-only matching: any `sse-*` or `ws-*` localized\n // form means the project needs that feature. The htmx-compat layer\n // scopes those features to their namespace, so any localized name\n // inside the namespace is unambiguous.\n //\n // hx-live needs an explicit set of translated suffixes because the\n // `hx-*` namespace also covers non-reactive attributes (hx-get,\n // hx-target, etc.) that don't require v4 routing.\n if (HX_LIVE_LOCALIZED_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsHxLive = true;\n usage.needsReactivity = true;\n }\n if (!usage.needsSSE && SSE_NS_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsSSE = true;\n }\n if (!usage.needsWS && WS_NS_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsWS = true;\n }\n\n // Final catch-all: pages authored with any other localized htmx\n // attribute name (`hx-obtener`, `hx-取得`, etc. — non-v4 features)\n // still need the htmx-compat bundle even if no English-form or v4\n // attribute matched. LOCALIZED_HX_PATTERN matches any hx-/sse-/ws-\n // attribute including Unicode suffixes.\n if (!usage.hasHtmxAttributes && LOCALIZED_HX_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n }\n\n return usage;\n }\n\n /**\n * Infer commands from htmx usage\n */\n private inferCommandsFromHtmx(htmx: HtmxUsage, usage: FileUsage): void {\n // HTTP requests need fetch block\n if (htmx.httpMethods.size > 0) {\n usage.blocks.add('fetch');\n usage.commands.add('put'); // Default swap uses put\n }\n\n // Swap strategy inference\n for (const swap of htmx.swapStrategies) {\n const strategy = swap.toLowerCase();\n // `morph`, `morph:innerHTML` and `morph:outerHTML` all emit `morph`.\n if (strategy.startsWith('morph')) {\n usage.commands.add('morph');\n if (strategy === 'morph:innerhtml') usage.commands.add('put');\n } else if (strategy === 'delete') {\n usage.commands.add('remove');\n } else {\n usage.commands.add('put');\n }\n }\n\n // `hx-swap=\"... swap:200ms settle:100ms\"` compiles to `wait <n>ms`.\n if (htmx.needsSwapTiming) {\n usage.commands.add('wait');\n }\n\n // hx-confirm needs if block\n if (htmx.usesConfirm) {\n usage.blocks.add('if');\n }\n }\n\n /**\n * Scan all files in a project directory\n * Used during production build to scan the entire codebase\n */\n async scanProject(dir: string): Promise<Map<string, FileUsage>> {\n const results = new Map<string, FileUsage>();\n\n try {\n const { glob } = await import('glob');\n const fs = await import('fs');\n\n const files = await glob('**/*.{html,htm,vue,svelte,js,jsx,ts,tsx,astro,php,erb,ejs,hbs}', {\n cwd: dir,\n ignore: ['node_modules/**', 'dist/**', '.git/**'],\n absolute: true,\n });\n\n for (const file of files) {\n if (this.shouldScan(file)) {\n try {\n const code = fs.readFileSync(file, 'utf-8');\n const usage = this.scan(code, file);\n if (\n usage.commands.size > 0 ||\n usage.blocks.size > 0 ||\n usage.positional ||\n usage.detectedLanguages.size > 0\n ) {\n results.set(file, usage);\n }\n } catch {\n // Skip files that can't be read\n }\n }\n }\n } catch (error) {\n console.warn('[hyperfixi] Error scanning project:', error);\n }\n\n return results;\n }\n}\n","/**\n * Language Keywords for Detection\n *\n * Maps of keywords for each of the 24 supported languages.\n * Used by the scanner to detect which languages are used in hyperscript templates.\n *\n * Note: These are a representative subset of keywords - enough to reliably\n * detect language usage without including every possible keyword variant.\n */\n\nimport type { CustomLanguageKeywords } from './types';\n\n/**\n * All supported language codes.\n */\nexport const SUPPORTED_LANGUAGES = [\n 'en',\n 'es',\n 'pt',\n 'fr',\n 'de',\n 'it',\n 'vi', // Western (Latin script)\n 'pl',\n 'ru',\n 'uk', // Slavic (Latin/Cyrillic)\n 'ja',\n 'zh',\n 'ko', // East Asian\n 'ar', // RTL (Arabic script)\n 'he', // RTL (Hebrew script)\n 'hi',\n 'bn', // South Asian (Indic scripts)\n 'th', // Southeast Asian (Thai script)\n 'tr', // Agglutinative Latin\n 'id',\n 'ms', // Malay (Latin script, closely related to id)\n 'sw',\n 'qu', // Other\n 'tl', // Tagalog (auto-added)\n] as const;\n\nexport type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\n/**\n * Regional bundle mappings.\n */\nexport const REGIONS = {\n western: ['en', 'es', 'pt', 'fr', 'de', 'it'] as SupportedLanguage[],\n 'east-asian': ['ja', 'zh', 'ko'] as SupportedLanguage[],\n slavic: ['pl', 'ru', 'uk'] as SupportedLanguage[],\n 'south-asian': ['hi', 'bn'] as SupportedLanguage[],\n priority: [\n 'en',\n 'es',\n 'pt',\n 'fr',\n 'de',\n 'it',\n 'ja',\n 'zh',\n 'ko',\n 'ar',\n 'tr',\n 'ru',\n 'hi',\n ] as SupportedLanguage[],\n all: SUPPORTED_LANGUAGES as unknown as SupportedLanguage[],\n};\n\n/**\n * Japanese keywords (hiragana, katakana, kanji).\n * Unique script makes detection straightforward.\n */\nexport const JAPANESE_KEYWORDS = new Set([\n '切り替え',\n '切り替える',\n 'トグル',\n 'トグルする',\n '追加',\n '追加する',\n '加える',\n '削除',\n '削除する',\n '取り除く',\n '表示',\n '表示する',\n '見せる',\n '隠す',\n '非表示',\n '非表示にする',\n '設定',\n '設定する',\n '増加',\n '増やす',\n 'インクリメント',\n '減少',\n '減らす',\n 'デクリメント',\n '引き金',\n '発火',\n 'トリガー',\n '送る',\n '送信',\n 'もし',\n 'そうでなければ',\n 'それ以外',\n '繰り返し',\n '繰り返す',\n 'リピート',\n '待つ',\n '待機',\n 'の間',\n '間',\n '結果',\n '最初',\n '最後',\n '次',\n '前',\n]);\n\n/**\n * Korean keywords (Hangul).\n * Unique script makes detection straightforward.\n */\nexport const KOREAN_KEYWORDS = new Set([\n '토글',\n '추가',\n '제거',\n '삭제',\n '보이다',\n '표시',\n '보이기',\n '보이세요',\n '숨기다',\n '숨기기',\n '숨기세요',\n '설정',\n '증가',\n '감소',\n '트리거',\n '보내다',\n '보내세요',\n '만약',\n '아니면',\n '반복',\n '대기',\n '동안',\n '결과',\n '첫번째',\n '마지막',\n '다음',\n '이전',\n]);\n\n/**\n * Chinese keywords (CJK characters).\n * Note: Some overlap with Japanese kanji, but context usually distinguishes.\n */\nexport const CHINESE_KEYWORDS = new Set([\n '切换',\n '添加',\n '加',\n '移除',\n '删除',\n '去掉',\n '显示',\n '展示',\n '隐藏',\n '设置',\n '设定',\n '增加',\n '减少',\n '触发',\n '发送',\n '如果',\n '否则',\n '重复',\n '等待',\n '持续',\n '结果',\n '第一个',\n '最后一个',\n '下一个',\n '上一个',\n]);\n\n/**\n * Arabic keywords (Arabic script).\n * RTL script makes detection straightforward.\n */\nexport const ARABIC_KEYWORDS = new Set([\n 'بدّل',\n 'بدل',\n 'غيّر',\n 'غير',\n 'أضف',\n 'اضف',\n 'احذف',\n 'أزل',\n 'امسح',\n 'اظهر',\n 'أظهر',\n 'اعرض',\n 'اخف',\n 'أخفِ',\n 'اخفي',\n 'أخف',\n 'اضبط',\n 'عيّن',\n 'حدد',\n 'زِد',\n 'زد',\n 'ارفع',\n 'أنقص',\n 'انقص',\n 'قلل',\n 'تشغيل',\n 'أطلق',\n 'فعّل',\n 'أرسل',\n 'إذا',\n 'وإلا',\n 'خلاف ذلك',\n 'كرر',\n 'انتظر',\n 'بينما',\n 'نتيجة',\n 'أول',\n 'آخر',\n 'التالي',\n 'السابق',\n]);\n\n/**\n * Hebrew keywords (Hebrew script).\n * Auto-synced from semantic profile.\n */\nexport const HE_KEYWORDS = new Set([\n 'מתג',\n 'הדלק כבה',\n 'הוסף',\n 'הסר',\n 'מחק',\n 'הורד',\n 'הראה',\n 'הצג',\n 'הסתר',\n 'החבא',\n 'קבע',\n 'הגדר',\n 'הגדל',\n 'הוסף אחד',\n 'הקטן',\n 'הפחת',\n 'הפעל',\n 'שגר',\n 'שלח',\n 'אם',\n 'אחרת',\n 'אם לא',\n 'חזור',\n 'חכה',\n 'המתן',\n 'כל עוד',\n 'בזמן',\n 'תוצאה',\n 'אחרון',\n]);\n\n/**\n * Spanish keywords (Latin script with accents).\n * Distinguished by specific Spanish words.\n */\nexport const SPANISH_KEYWORDS = new Set([\n 'alternar',\n 'conmutar',\n 'agregar',\n 'añadir',\n 'quitar',\n 'eliminar',\n 'remover',\n 'sacar',\n 'borrar',\n 'mostrar',\n 'enseñar',\n 'muestra',\n 'ocultar',\n 'esconder',\n 'establecer',\n 'fijar',\n 'definir',\n 'establece',\n 'incrementar',\n 'aumentar',\n 'decrementar',\n 'disminuir',\n 'disparar',\n 'activar',\n 'enviar',\n 'envía',\n 'si',\n 'sino',\n 'de lo contrario',\n 'repetir',\n 'esperar',\n 'mientras',\n 'resultado',\n 'primero',\n 'primera',\n 'último',\n 'ultima',\n 'siguiente',\n 'anterior',\n]);\n\n/**\n * Portuguese keywords (Latin script with accents).\n * Distinguished by specific Portuguese words.\n */\nexport const PORTUGUESE_KEYWORDS = new Set([\n 'alternar',\n 'adicionar',\n 'acrescentar',\n 'remover',\n 'eliminar',\n 'apagar',\n 'remova',\n 'mostrar',\n 'exibir',\n 'ocultar',\n 'esconder',\n 'esconda',\n 'definir',\n 'configurar',\n 'defina',\n 'incrementar',\n 'aumentar',\n 'decrementar',\n 'diminuir',\n 'disparar',\n 'ativar',\n 'enviar',\n 'se',\n 'senão',\n 'repetir',\n 'esperar',\n 'aguardar',\n 'enquanto',\n 'resultado',\n 'primeiro',\n 'último',\n 'próximo',\n 'anterior',\n]);\n\n/**\n * French keywords (Latin script with accents).\n * Distinguished by specific French words.\n */\nexport const FRENCH_KEYWORDS = new Set([\n 'basculer',\n 'alterner',\n 'ajouter',\n 'supprimer',\n 'enlever',\n 'retirer',\n 'retire',\n 'montrer',\n 'afficher',\n 'montre',\n 'cacher',\n 'masquer',\n 'définir',\n 'établir',\n 'incrémenter',\n 'augmenter',\n 'décrémenter',\n 'diminuer',\n 'déclencher',\n 'envoyer',\n 'envoie',\n 'si',\n 'sinon',\n 'répéter',\n 'attendre',\n 'pendant',\n 'résultat',\n 'premier',\n 'dernier',\n 'suivant',\n 'précédent',\n]);\n\n/**\n * German keywords (Latin script with umlauts).\n * Distinguished by specific German words.\n */\nexport const GERMAN_KEYWORDS = new Set([\n 'umschalten',\n 'wechseln',\n 'hinzufügen',\n 'entfernen',\n 'löschen',\n 'zeigen',\n 'anzeigen',\n 'verbergen',\n 'verstecken',\n 'festlegen',\n 'definieren',\n 'erhöhen',\n 'verringern',\n 'vermindern',\n 'auslösen',\n 'senden',\n 'schicken',\n 'falls',\n 'sofern',\n 'sonst',\n 'ansonsten',\n 'wiederholen',\n 'warten',\n 'solange',\n 'während',\n 'ergebnis',\n 'erste',\n 'letzte',\n 'nächste',\n 'vorherige',\n]);\n\n/**\n * Turkish keywords (Latin script with special chars).\n * Distinguished by Turkish-specific characters and words.\n */\nexport const TURKISH_KEYWORDS = new Set([\n 'değiştir',\n 'aç/kapat',\n 'ekle',\n 'kaldır',\n 'sil',\n 'göster',\n 'gizle',\n 'ayarla',\n 'belirle',\n 'artır',\n 'azalt',\n 'tetikle',\n 'gönder',\n 'eğer',\n 'yoksa',\n 'tekrarla',\n 'bekle',\n 'süresince',\n 'sonuç',\n 'ilk',\n 'sonuncu',\n 'sonraki',\n 'önceki',\n]);\n\n/**\n * Indonesian keywords (Latin script).\n * Distinguished by specific Indonesian words.\n */\nexport const INDONESIAN_KEYWORDS = new Set([\n 'alihkan',\n 'tambah',\n 'tambahkan',\n 'hapus',\n 'buang',\n 'hilangkan',\n 'tampilkan',\n 'perlihatkan',\n 'sembunyikan',\n 'tutup',\n 'atur',\n 'tetapkan',\n 'tingkatkan',\n 'naikkan',\n 'turunkan',\n 'kurangi',\n 'picu',\n 'jalankan',\n 'kirim',\n 'kirimkan',\n 'jika',\n 'kalau',\n 'bila',\n 'selainnya',\n 'lainnya',\n 'ulangi',\n 'tunggu',\n 'selama',\n 'hasil',\n 'pertama',\n 'terakhir',\n 'berikutnya',\n 'sebelumnya',\n]);\n\n/**\n * Malay keywords (Latin script).\n * Auto-synced from semantic profile.\n */\nexport const MS_KEYWORDS = new Set([\n 'togol',\n 'tukar',\n 'tambah',\n 'buang',\n 'padam',\n 'tunjuk',\n 'sembunyi',\n 'sorok',\n 'tetapkan',\n 'setkan',\n 'tambah_satu',\n 'kurang_satu',\n 'cetuskan',\n 'hantar',\n 'jika',\n 'kalau',\n 'kalau_tidak',\n 'jika_tidak',\n 'ulang',\n 'tunggu',\n 'selagi',\n 'semasa',\n 'hasil',\n 'pertama',\n 'terakhir',\n 'seterusnya',\n 'sebelumnya',\n]);\n\n/**\n * Swahili keywords (Latin script).\n * Distinguished by specific Swahili words.\n */\nexport const SWAHILI_KEYWORDS = new Set([\n 'badilisha',\n 'ongeza',\n 'ondoa',\n 'futa',\n 'toa',\n 'onyesha',\n 'ficha',\n 'mficho',\n 'seti',\n 'ongezeko',\n 'punguza',\n 'chochea',\n 'tuma',\n 'peleka',\n 'kama',\n 'ikiwa',\n 'vinginevyo',\n 'sivyo',\n 'rudia',\n 'subiri',\n 'ngoja',\n 'kadri',\n 'matokeo',\n 'kwanza',\n 'wamwisho',\n 'ijayo',\n 'iliyopita',\n]);\n\n/**\n * Quechua keywords (Latin script).\n * Distinguished by specific Quechua words.\n */\nexport const QUECHUA_KEYWORDS = new Set([\n 't',\n 'tikray',\n 'yapay',\n 'yapaykuy',\n 'qichuy',\n 'hurquy',\n 'anchuchiy',\n 'rikuchiy',\n 'qawachiy',\n 'pakay',\n 'pakakuy',\n 'churanay',\n 'kamaykuy',\n 'yapachiy',\n 'pisiyachiy',\n 'kuyuchiy',\n 'kichay',\n 'kachay',\n 'apachiy',\n 'sichus',\n 'manachus',\n 'hukniraq',\n 'kutipay',\n 'muyu',\n 'suyay',\n 'kaykamaqa',\n 'lluqsiy',\n 'ñawpaq',\n 'qhipa',\n 'qhipantin',\n 'ñawpaqnin',\n]);\n\n/**\n * Italian keywords (Latin script).\n * Distinguished by specific Italian words.\n */\nexport const ITALIAN_KEYWORDS = new Set([\n 'commutare',\n 'alternare',\n 'aggiungere',\n 'aggiungi',\n 'rimuovere',\n 'eliminare',\n 'togliere',\n 'mostrare',\n 'visualizzare',\n 'nascondere',\n 'impostare',\n 'definire',\n 'incrementare',\n 'aumentare',\n 'decrementare',\n 'diminuire',\n 'scatenare',\n 'attivare',\n 'inviare',\n 'se',\n 'altrimenti',\n 'ripetere',\n 'aspettare',\n 'attendere',\n 'mentre',\n 'risultato',\n 'primo',\n 'ultimo',\n 'prossimo',\n 'precedente',\n]);\n\n/**\n * Vietnamese keywords (Latin script with diacritics).\n * Distinguished by Vietnamese-specific diacritics and words.\n */\nexport const VIETNAMESE_KEYWORDS = new Set([\n 'chuyển đổi',\n 'bật tắt',\n 'chuyển',\n 'thêm',\n 'bổ sung',\n 'xóa',\n 'gỡ bỏ',\n 'loại bỏ',\n 'bỏ',\n 'hiển thị',\n 'hiện',\n 'ẩn',\n 'che',\n 'giấu',\n 'gán',\n 'thiết lập',\n 'tăng',\n 'tăng lên',\n 'giảm',\n 'giảm đi',\n 'kích hoạt',\n 'gửi',\n 'nếu',\n 'không thì',\n 'nếu không',\n 'lặp lại',\n 'chờ',\n 'đợi',\n 'chờ đợi',\n 'trong khi',\n 'kết quả',\n 'đầu tiên',\n 'cuối cùng',\n 'tiếp theo',\n 'trước đó',\n]);\n\n/**\n * Polish keywords (Latin script).\n * Distinguished by Polish-specific characters and words.\n */\nexport const POLISH_KEYWORDS = new Set([\n 'przełącz',\n 'przelacz',\n 'dodaj',\n 'usuń',\n 'usun',\n 'wyczyść',\n 'wyczysc',\n 'pokaż',\n 'pokaz',\n 'wyświetl',\n 'wyswietl',\n 'ukryj',\n 'schowaj',\n 'ustaw',\n 'określ',\n 'okresl',\n 'zwiększ',\n 'zwieksz',\n 'zmniejsz',\n 'wyzwól',\n 'wyzwol',\n 'wyślij',\n 'wyslij',\n 'jeśli',\n 'jesli',\n 'jeżeli',\n 'jezeli',\n 'inaczej',\n 'wpp',\n 'powtórz',\n 'powtorz',\n 'czekaj',\n 'poczekaj',\n 'dopóki',\n 'dopoki',\n 'podczas',\n 'wynik',\n 'pierwszy',\n 'ostatni',\n 'następny',\n 'poprzedni',\n]);\n\n/**\n * Russian keywords (Cyrillic script).\n * Unique script makes detection straightforward.\n */\nexport const RUSSIAN_KEYWORDS = new Set([\n 'переключить',\n 'переключи',\n 'добавить',\n 'добавь',\n 'удалить',\n 'удали',\n 'убрать',\n 'убери',\n 'показать',\n 'покажи',\n 'скрыть',\n 'скрой',\n 'спрятать',\n 'спрячь',\n 'установить',\n 'установи',\n 'задать',\n 'задай',\n 'увеличить',\n 'увеличь',\n 'уменьшить',\n 'уменьши',\n 'инициировать',\n 'запустить',\n 'запусти',\n 'отправить',\n 'отправь',\n 'если',\n 'иначе',\n 'повторить',\n 'повтори',\n 'ждать',\n 'жди',\n 'подожди',\n 'пока',\n 'результат',\n 'первый',\n 'последний',\n 'следующий',\n 'предыдущий',\n]);\n\n/**\n * Ukrainian keywords (Cyrillic script).\n * Unique script makes detection straightforward.\n */\nexport const UKRAINIAN_KEYWORDS = new Set([\n 'перемкнути',\n 'перемкни',\n 'додати',\n 'додай',\n 'видалити',\n 'видали',\n 'прибрати',\n 'прибери',\n 'показати',\n 'покажи',\n 'сховати',\n 'сховай',\n 'приховати',\n 'приховай',\n 'встановити',\n 'встанови',\n 'задати',\n 'задай',\n 'збільшити',\n 'збільш',\n 'зменшити',\n 'зменш',\n 'ініціювати',\n 'запустити',\n 'запусти',\n 'надіслати',\n 'надішли',\n 'якщо',\n 'інакше',\n 'повторити',\n 'повтори',\n 'чекати',\n 'чекай',\n 'зачекай',\n 'поки',\n 'результат',\n 'перший',\n 'останній',\n 'наступний',\n 'попередній',\n]);\n\n/**\n * Hindi keywords (Devanagari script).\n * Unique script makes detection straightforward.\n */\nexport const HINDI_KEYWORDS = new Set([\n 'टॉगल',\n 'बदलें',\n 'बदल',\n 'जोड़ें',\n 'जोड़',\n 'हटाएं',\n 'हटा',\n 'मिटाएं',\n 'दिखाएं',\n 'दिखा',\n 'छिपाएं',\n 'छिपा',\n 'सेट',\n 'निर्धारित',\n 'बढ़ाएं',\n 'बढ़ा',\n 'घटाएं',\n 'घटा',\n 'ट्रिगर',\n 'भेजें',\n 'भेज',\n 'अगर',\n 'यदि',\n 'वरना',\n 'नहीं तो',\n 'दोहराएं',\n 'दोहरा',\n 'प्रतीक्षा',\n 'रुकें',\n 'जब तक',\n 'परिणाम',\n 'पहला',\n 'अंतिम',\n 'अगला',\n 'पिछला',\n]);\n\n/**\n * Bengali keywords (Bengali script).\n * Unique script makes detection straightforward.\n */\nexport const BENGALI_KEYWORDS = new Set([\n 'টগল',\n 'যোগ',\n 'যোগ করুন',\n 'সরান',\n 'সরিয়ে ফেলুন',\n 'মুছুন',\n 'দেখান',\n 'দেখাও',\n 'লুকান',\n 'লুকাও',\n 'সেট',\n 'নির্ধারণ',\n 'বৃদ্ধি',\n 'বাড়ান',\n 'হ্রাস',\n 'কমান',\n 'ট্রিগার',\n 'পাঠান',\n 'পাঠাও',\n 'যদি',\n 'নতুবা',\n 'না হলে',\n 'পুনরাবৃত্তি',\n 'বার বার',\n 'অপেক্ষা',\n 'যতক্ষণ',\n 'ফলাফল',\n 'প্রথম',\n 'শেষ',\n 'পরবর্তী',\n 'আগের',\n]);\n\n/**\n * Thai keywords (Thai script).\n * Unique script makes detection straightforward.\n */\nexport const THAI_KEYWORDS = new Set([\n 'สลับ',\n 'เพิ่ม',\n 'ลบ',\n 'ลบออก',\n 'แสดง',\n 'ซ่อน',\n 'ตั้ง',\n 'กำหนด',\n 'เพิ่มค่า',\n 'ลดค่า',\n 'ทริกเกอร์',\n 'ส่ง',\n 'ถ้า',\n 'หาก',\n 'ไม่งั้น',\n 'ไม่เช่นนั้น',\n 'ทำซ้ำ',\n 'รอ',\n 'ในขณะที่',\n 'ผลลัพธ์',\n 'แรก',\n 'สุดท้าย',\n 'ถัดไป',\n 'ก่อนหน้า',\n]);\n\n/**\n * Tagalog keywords (Latin script).\n * TODO: Fill in keywords after completing the semantic profile.\n * Run 'npm run sync-keywords' to auto-populate from profile.\n */\nexport const TL_KEYWORDS = new Set([\n 'palitan',\n 'itoggle',\n 'idagdag',\n 'magdagdag',\n 'alisin',\n 'tanggalin',\n 'ipakita',\n 'magpakita',\n 'itago',\n 'magtago',\n 'itakda',\n 'magtakda',\n 'dagdagan',\n 'taasan',\n 'bawasan',\n 'ibaba',\n 'palitawin',\n 'magpatugtog',\n 'ipadala',\n 'magpadala',\n 'kung',\n 'kung_hindi',\n 'kundi',\n 'ulitin',\n 'paulit-ulit',\n 'maghintay',\n 'hintay',\n 'habang',\n 'resulta',\n 'una',\n 'huli',\n 'susunod',\n 'nakaraan',\n]);\n\n/**\n * Map of language code to keyword set.\n */\nexport const LANGUAGE_KEYWORDS: Record<SupportedLanguage, Set<string>> = {\n en: new Set(), // English is the default, no detection needed\n ja: JAPANESE_KEYWORDS,\n ko: KOREAN_KEYWORDS,\n zh: CHINESE_KEYWORDS,\n ar: ARABIC_KEYWORDS,\n he: HE_KEYWORDS,\n es: SPANISH_KEYWORDS,\n pt: PORTUGUESE_KEYWORDS,\n fr: FRENCH_KEYWORDS,\n de: GERMAN_KEYWORDS,\n it: ITALIAN_KEYWORDS,\n vi: VIETNAMESE_KEYWORDS,\n pl: POLISH_KEYWORDS,\n ru: RUSSIAN_KEYWORDS,\n uk: UKRAINIAN_KEYWORDS,\n hi: HINDI_KEYWORDS,\n bn: BENGALI_KEYWORDS,\n th: THAI_KEYWORDS,\n tr: TURKISH_KEYWORDS,\n id: INDONESIAN_KEYWORDS,\n ms: MS_KEYWORDS,\n sw: SWAHILI_KEYWORDS,\n qu: QUECHUA_KEYWORDS,\n tl: TL_KEYWORDS,\n};\n\n/**\n * Check if a script contains keywords from a specific language.\n * Returns true if any keyword from the language is found.\n *\n * Uses word boundary matching to avoid false positives from short keywords.\n * For non-Latin scripts (CJK, Arabic, etc.), simple includes is sufficient\n * since these characters don't appear in English/ASCII.\n */\nexport function containsLanguageKeywords(script: string, language: SupportedLanguage): boolean {\n const keywords = LANGUAGE_KEYWORDS[language];\n if (!keywords || keywords.size === 0) return false;\n\n // Non-Latin scripts can use simple includes (no risk of false positives)\n // Includes: CJK (ja, ko, zh), Arabic (ar), Hebrew (he), Cyrillic (ru, uk), Indic (hi, bn), Thai (th)\n const nonLatinLangs: SupportedLanguage[] = [\n 'ja',\n 'ko',\n 'zh',\n 'ar',\n 'he',\n 'ru',\n 'uk',\n 'hi',\n 'bn',\n 'th',\n ];\n if (nonLatinLangs.includes(language)) {\n for (const keyword of keywords) {\n if (script.includes(keyword)) {\n return true;\n }\n }\n return false;\n }\n\n // Latin-script languages need word boundary matching to avoid false positives\n // from short keywords like 'es', 'o', 'si', etc.\n const lowerScript = script.toLowerCase();\n for (const keyword of keywords) {\n // Skip very short keywords (2 chars or less) - too many false positives\n if (keyword.length <= 2) continue;\n\n // Use word boundary matching\n const pattern = new RegExp(`\\\\b${escapeRegExp(keyword.toLowerCase())}\\\\b`);\n if (pattern.test(lowerScript)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Detect all languages used in a hyperscript string.\n * Returns a Set of language codes found.\n *\n * Note: English is never detected (it's the default).\n * Only non-English languages are detected.\n */\nexport function detectLanguages(script: string): Set<SupportedLanguage> {\n const detected = new Set<SupportedLanguage>();\n\n for (const lang of SUPPORTED_LANGUAGES) {\n if (lang === 'en') continue; // Skip English\n\n if (containsLanguageKeywords(script, lang)) {\n detected.add(lang);\n }\n }\n\n return detected;\n}\n\n// =============================================================================\n// Custom Keywords Support\n// =============================================================================\n\n/**\n * Runtime keyword registry for custom/extended languages.\n * Use registerCustomKeywords() to add or extend language keywords.\n */\nconst customKeywordRegistry: Map<string, { keywords: Set<string>; isNonLatin: boolean }> =\n new Map();\n\n/**\n * Register custom keywords for a language.\n * Call this before scanning to add or extend language detection.\n *\n * @param code - Language code (e.g., 'es', 'my-lang')\n * @param config - Keyword configuration\n */\nexport function registerCustomKeywords(code: string, config: CustomLanguageKeywords): void {\n const existing = LANGUAGE_KEYWORDS[code as SupportedLanguage];\n const nonLatinLangs = ['ja', 'ko', 'zh', 'ar', 'ru', 'uk', 'hi', 'bn', 'th'];\n const isNonLatin = config.isNonLatin ?? nonLatinLangs.includes(code);\n\n if (config.extend && existing) {\n // Merge with existing keywords\n const merged = new Set([...existing, ...config.keywords]);\n customKeywordRegistry.set(code, { keywords: merged, isNonLatin });\n } else {\n // Replace or add new\n customKeywordRegistry.set(code, { keywords: config.keywords, isNonLatin });\n }\n}\n\n/**\n * Get keywords for a language, including custom registrations.\n */\nexport function getKeywordsForLanguage(code: string): Set<string> | undefined {\n const custom = customKeywordRegistry.get(code);\n if (custom) return custom.keywords;\n return LANGUAGE_KEYWORDS[code as SupportedLanguage];\n}\n\n/**\n * Check if a language uses non-Latin script.\n */\nexport function isNonLatinLanguage(code: string): boolean {\n const custom = customKeywordRegistry.get(code);\n if (custom) return custom.isNonLatin;\n const nonLatinLangs = ['ja', 'ko', 'zh', 'ar', 'ru', 'uk', 'hi', 'bn', 'th'];\n return nonLatinLangs.includes(code);\n}\n\n/**\n * Get all registered language codes (built-in + custom).\n */\nexport function getAllLanguageCodes(): string[] {\n const builtin = [...SUPPORTED_LANGUAGES];\n const custom = [...customKeywordRegistry.keys()];\n return [...new Set([...builtin, ...custom])];\n}\n\n/**\n * Clear all custom keyword registrations.\n */\nexport function clearCustomKeywords(): void {\n customKeywordRegistry.clear();\n}\n\n// =============================================================================\n// Region Detection\n// =============================================================================\n\n/**\n * Get the optimal regional bundle for a set of detected languages.\n * Returns the smallest bundle that covers all detected languages.\n */\nexport function getOptimalRegion(\n languages: Set<SupportedLanguage>\n): 'western' | 'east-asian' | 'slavic' | 'south-asian' | 'priority' | 'all' | null {\n if (languages.size === 0) return null;\n\n const langArray = [...languages];\n\n // Check if all languages fit in western bundle\n if (langArray.every(l => REGIONS.western.includes(l))) {\n return 'western';\n }\n\n // Check if all languages fit in east-asian bundle\n if (langArray.every(l => REGIONS['east-asian'].includes(l))) {\n return 'east-asian';\n }\n\n // Check if all languages fit in slavic bundle\n if (langArray.every(l => REGIONS.slavic.includes(l))) {\n return 'slavic';\n }\n\n // Check if all languages fit in south-asian bundle\n if (langArray.every(l => REGIONS['south-asian'].includes(l))) {\n return 'south-asian';\n }\n\n // Check if all languages fit in priority bundle\n if (langArray.every(l => REGIONS.priority.includes(l))) {\n return 'priority';\n }\n\n // Need full bundle\n return 'all';\n}\n","/**\n * Localized htmx-compat attribute name maps for the scanner.\n *\n * The vocab generator at `packages/core/scripts/gen-htmx-vocab.mjs`\n * emits per-language vocab modules under `packages/core/vocab/htmx/`.\n * Those modules drive the runtime orchestrator. The scanner needs the\n * same information at build time so it can route projects authored in\n * non-English languages to the correct bundle.\n *\n * Re-sync this file whenever the vocab regenerates:\n *\n * npm run sync-htmx-vocab --prefix packages/vite-plugin\n *\n * Drift detection happens via a unit test that re-derives the maps from\n * `packages/core/vocab/htmx/*.js` and compares against this file's\n * contents.\n */\n\n/**\n * Localized names that mean `hx-live` (htmx v4 reactive expression).\n * Used to set `needsHxLive` + `needsReactivity` for non-English authors.\n *\n * Auto-derived from `packages/core/vocab/htmx/*.js`. Re-sync if vocab\n * changes (see file-level comment).\n */\nexport const HX_LIVE_LOCALIZED: ReadonlySet<string> = new Set([\n // Each entry is the suffix after the `hx-` prefix.\n 'مباشر', // ar\n 'লাইভ', // bn\n 'direkt', // de\n 'en-vivo', // es\n 'en-direct', // fr\n 'חי', // he\n 'लाइव', // hi\n 'langsung', // id\n 'in-diretta', // it\n 'ライブ', // ja\n '실시간', // ko\n 'langsung', // ms\n 'na-żywo', // pl\n 'ao-vivo', // pt\n 'kawsachkaq', // qu\n 'в-прямом-эфире', // ru\n 'moja-kwa-moja', // sw\n 'ไลฟ์', // th\n 'canlı', // tr\n 'наживо', // uk\n 'trực-tiếp', // vi\n '实时', // zh\n]);\n\n/**\n * Build a single regex that matches any localized form of `hx-live`.\n * Anchored on word boundary + attribute-assignment to avoid matching\n * inside JS strings or partial words.\n */\nexport function buildLocalizedHxLivePattern(): RegExp {\n const suffixes = [...HX_LIVE_LOCALIZED]\n .map(s => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('|');\n // Unicode mode required for Hebrew/Arabic/CJK character classes.\n return new RegExp(`\\\\bhx-(?:${suffixes})\\\\s*=\\\\s*[\"']`, 'u');\n}\n\n/**\n * Any `sse-*` attribute (English or localized) triggers needsSSE.\n * The htmx-compat layer scopes SSE features to attributes inside the\n * `sse-` namespace, so namespace-only matching is correct.\n */\nexport const SSE_NS_PATTERN = /\\bsse-[\\w\\-\\p{L}]+\\s*=\\s*[\"']/u;\n\n/** Any `ws-*` attribute triggers needsWS — see SSE_NS_PATTERN. */\nexport const WS_NS_PATTERN = /\\bws-[\\w\\-\\p{L}]+\\s*=\\s*[\"']/u;\n","/**\n * Aggregator\n *\n * Collects and aggregates hyperscript usage across all scanned files.\n */\n\nimport type { FileUsage, AggregatedUsage, HtmxUsage } from './types';\n\n/**\n * Aggregator class for collecting usage across files\n */\nexport class Aggregator {\n private fileUsage: Map<string, FileUsage> = new Map();\n private cachedUsage: AggregatedUsage | null = null;\n\n /**\n * Add or update usage for a file\n * @returns true if the overall usage changed\n */\n add(filePath: string, usage: FileUsage): boolean {\n const existing = this.fileUsage.get(filePath);\n\n // Check if anything changed\n if (existing) {\n const commandsEqual = this.setsEqual(existing.commands, usage.commands);\n const blocksEqual = this.setsEqual(existing.blocks, usage.blocks);\n const positionalEqual = existing.positional === usage.positional;\n const languagesEqual = this.setsEqual(existing.detectedLanguages, usage.detectedLanguages);\n const htmxEqual = this.htmxUsageEqual(existing.htmx, usage.htmx);\n\n if (commandsEqual && blocksEqual && positionalEqual && languagesEqual && htmxEqual) {\n return false; // No change\n }\n }\n\n // Update file usage\n this.fileUsage.set(filePath, usage);\n this.cachedUsage = null; // Invalidate cache\n\n return true;\n }\n\n /**\n * Remove a file from tracking (e.g., when deleted)\n * @returns true if the overall usage changed\n */\n remove(filePath: string): boolean {\n const existed = this.fileUsage.delete(filePath);\n if (existed) {\n this.cachedUsage = null;\n }\n return existed;\n }\n\n /**\n * Get aggregated usage across all files\n */\n getUsage(): AggregatedUsage {\n if (this.cachedUsage) {\n return this.cachedUsage;\n }\n\n const commands = new Set<string>();\n const blocks = new Set<string>();\n const detectedLanguages = new Set<string>();\n let positional = false;\n\n // Aggregate htmx usage\n const htmx: HtmxUsage = {\n hasHtmxAttributes: false,\n hasFixiAttributes: false,\n httpMethods: new Set(),\n swapStrategies: new Set(),\n onHandlers: [],\n triggerModifiers: new Set(),\n urlManagement: new Set(),\n usesConfirm: false,\n needsSwapTiming: false,\n needsHxLive: false,\n needsSSE: false,\n needsWS: false,\n needsBindToProperty: false,\n needsReactivity: false,\n };\n let needsReactivity = false;\n let needsBindToProperty = false;\n\n for (const usage of this.fileUsage.values()) {\n for (const cmd of usage.commands) commands.add(cmd);\n for (const block of usage.blocks) blocks.add(block);\n for (const lang of usage.detectedLanguages) detectedLanguages.add(lang);\n if (usage.positional) positional = true;\n if (usage.needsReactivity) needsReactivity = true;\n if (usage.needsBindToProperty) needsBindToProperty = true;\n\n // Aggregate htmx usage\n if (usage.htmx) {\n if (usage.htmx.hasHtmxAttributes) htmx.hasHtmxAttributes = true;\n if (usage.htmx.hasFixiAttributes) htmx.hasFixiAttributes = true;\n for (const method of usage.htmx.httpMethods) htmx.httpMethods.add(method);\n for (const swap of usage.htmx.swapStrategies) htmx.swapStrategies.add(swap);\n htmx.onHandlers.push(...usage.htmx.onHandlers);\n for (const modifier of usage.htmx.triggerModifiers) htmx.triggerModifiers.add(modifier);\n for (const url of usage.htmx.urlManagement) htmx.urlManagement.add(url);\n if (usage.htmx.usesConfirm) htmx.usesConfirm = true;\n if (usage.htmx.needsSwapTiming) htmx.needsSwapTiming = true;\n if (usage.htmx.needsHxLive) htmx.needsHxLive = true;\n if (usage.htmx.needsSSE) htmx.needsSSE = true;\n if (usage.htmx.needsWS) htmx.needsWS = true;\n if (usage.htmx.needsBindToProperty) htmx.needsBindToProperty = true;\n if (usage.htmx.needsReactivity) {\n htmx.needsReactivity = true;\n needsReactivity = true;\n }\n }\n }\n\n this.cachedUsage = {\n commands,\n blocks,\n positional,\n detectedLanguages,\n htmx,\n needsReactivity,\n needsBindToProperty,\n fileUsage: new Map(this.fileUsage),\n };\n\n return this.cachedUsage;\n }\n\n /**\n * Load usage from a project scan\n */\n loadFromScan(scannedFiles: Map<string, FileUsage>): void {\n this.fileUsage = new Map(scannedFiles);\n this.cachedUsage = null;\n }\n\n /**\n * Check if any hyperscript usage has been detected\n */\n hasUsage(): boolean {\n const usage = this.getUsage();\n return (\n usage.commands.size > 0 ||\n usage.blocks.size > 0 ||\n usage.positional ||\n usage.detectedLanguages.size > 0\n );\n }\n\n /**\n * Get summary for logging\n */\n getSummary(): {\n commands: string[];\n blocks: string[];\n positional: boolean;\n languages: string[];\n fileCount: number;\n } {\n const usage = this.getUsage();\n return {\n commands: [...usage.commands].sort(),\n blocks: [...usage.blocks].sort(),\n positional: usage.positional,\n languages: [...usage.detectedLanguages].sort(),\n fileCount: this.fileUsage.size,\n };\n }\n\n /**\n * Clear all tracked usage\n */\n clear(): void {\n this.fileUsage.clear();\n this.cachedUsage = null;\n }\n\n /**\n * Compare two sets for equality\n */\n private setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const item of a) {\n if (!b.has(item)) return false;\n }\n return true;\n }\n\n /**\n * Compare two HtmxUsage objects for equality\n */\n private htmxUsageEqual(a?: HtmxUsage, b?: HtmxUsage): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.hasHtmxAttributes === b.hasHtmxAttributes &&\n a.hasFixiAttributes === b.hasFixiAttributes &&\n this.setsEqual(a.httpMethods, b.httpMethods) &&\n this.setsEqual(a.swapStrategies, b.swapStrategies) &&\n this.setsEqual(a.triggerModifiers, b.triggerModifiers) &&\n this.setsEqual(a.urlManagement, b.urlManagement) &&\n a.usesConfirm === b.usesConfirm &&\n !!a.needsSwapTiming === !!b.needsSwapTiming &&\n // htmx v4 / reactivity flags: these drive selection of the hx-v4 tier,\n // so a change must count as \"usage changed\" or HMR serves a stale\n // bundle. They were omitted when the v4 surface landed (#623).\n !!a.needsHxLive === !!b.needsHxLive &&\n !!a.needsSSE === !!b.needsSSE &&\n !!a.needsWS === !!b.needsWS &&\n !!a.needsBindToProperty === !!b.needsBindToProperty &&\n !!a.needsReactivity === !!b.needsReactivity &&\n this.arraysEqual(a.onHandlers, b.onHandlers)\n );\n }\n\n private arraysEqual(a?: string[], b?: string[]): boolean {\n const aa = a ?? [];\n const bb = b ?? [];\n return aa.length === bb.length && aa.every((v, i) => v === bb[i]);\n }\n}\n","/**\n * Generator\n *\n * Generates minimal LokaScript bundles based on detected usage.\n * Uses shared templates from @hyperfixi/core/bundle-generator.\n * Supports multilingual semantic parsing when enabled.\n */\n\nimport type { AggregatedUsage, HyperfixiPluginOptions } from './types';\nimport {\n COMMAND_IMPLEMENTATIONS as COMMAND_IMPL_TS,\n BLOCK_IMPLEMENTATIONS as BLOCK_IMPL_TS,\n STYLE_COMMANDS,\n ELEMENT_ARRAY_COMMANDS,\n MORPH_COMMANDS,\n LITE_PARSER_TEMPLATE,\n HYBRID_PARSER_TEMPLATE,\n canUseLiteParser,\n FULL_RUNTIME_ONLY_COMMANDS,\n isAvailableCommand,\n} from '@hyperfixi/core/bundle-generator';\nimport {\n resolveSemanticConfig,\n generateSemanticIntegrationCode,\n getSemanticExports,\n getSemanticBundleSize,\n type SemanticConfig,\n} from './semantic-integration';\n\n// =============================================================================\n// BUNDLE GENERATOR\n// =============================================================================\n\n/**\n * Generator options interface\n */\ninterface GeneratorOptions {\n name: string;\n commands: string[];\n blocks?: string[];\n positionalExpressions?: boolean;\n htmxIntegration?: boolean;\n globalName?: string;\n /** @deprecated Parser is now embedded directly. This option is ignored. */\n parserImportPath?: string;\n autoInit?: boolean;\n esModule?: boolean;\n /** Parser type to embed: 'lite' for regex-based, 'hybrid' for full AST */\n parserType?: 'lite' | 'hybrid';\n}\n\n/**\n * Strip TypeScript type annotations for JavaScript output.\n *\n * Uses comprehensive regex patterns to handle all TypeScript-specific syntax:\n * - Generic type casts: `as Record<string, any>`, `as Map<K, V>`\n * - Variable type annotations: `const x: Type = ...`\n * - Function parameter types: `(param: Type) => ...`\n * - Return type annotations: `function foo(): Type { ... }`\n * - Utility types: `Partial<T>`, `Pick<T, K>`, `Omit<T, K>`\n */\nfunction stripTypes(code: string): string {\n return (\n code\n // Remove \" as Type<...>\" casts with generics (handles nested angle brackets)\n // Matches: as Record<string, any>, as Map<K, V>, as Partial<SomeType>\n .replace(/\\s+as\\s+\\w+<[^>]*(?:<[^>]*>[^>]*)*>/g, '')\n // Remove \" as Type\" simple casts (after generic removal)\n .replace(/\\s+as\\s+\\w+(?:\\[\\])?/g, '')\n // Remove variable/const/let type annotations with generics (including array types)\n // Matches: const x: Map<string, number>, let y: Record<K, V>, const z: Promise<void>[]\n .replace(/:\\s*\\w+<[^>]*(?:<[^>]*>[^>]*)*>(?:\\[\\])?(?=\\s*[=;,)\\]])/g, '')\n // Remove simple type annotations in declarations\n // Matches: const x: string, let y: number, but NOT in ternary or object literals\n .replace(\n /:\\s*(?:string|number|boolean|any|unknown|void|never|null|undefined|object|symbol|bigint)(?=\\s*[=;,)\\]])/g,\n ''\n )\n // Remove interface/type name annotations (e.g., \": SomeInterface\")\n // Only when followed by = ; , ) ] to avoid breaking ternary operators\n .replace(/:\\s*[A-Z]\\w*(?:\\[\\])?(?=\\s*[=;,)\\]])/g, '')\n // Remove \": Type\" in catch clauses like \"catch (error: unknown)\"\n .replace(/\\((\\w+):\\s*(?:\\w+|unknown|any)\\)/g, '($1)')\n // Remove Promise generic parameters\n .replace(/Promise<[^>]+>/g, 'Promise')\n // Remove Array generic parameters\n .replace(/Array<[^>]+>/g, 'Array')\n // Remove function return type annotations\n // Matches: function foo(): Type {, async (): Promise => {\n .replace(/\\):\\s*\\w+(?:<[^>]*>)?(?:\\[\\])?\\s*(?=[{=])/g, ') ')\n // Remove arrow function return types\n .replace(/\\):\\s*\\w+(?:<[^>]*>)?\\s*=>/g, ') =>')\n // Clean up any remaining TransitionEvent or specific DOM types\n .replace(\n /:\\s*(?:TransitionEvent|MouseEvent|KeyboardEvent|Event|Element|HTMLElement|Node)(?=\\s*[=;,)\\]])/g,\n ''\n )\n // Remove non-null assertions (property! -> property)\n // Matches: block.condition!, obj.prop!, but NOT !condition or !=\n .replace(/(\\w)!(?=[,;)\\].\\s])/g, '$1')\n );\n}\n\n// Get JavaScript-formatted implementations (type annotations stripped)\nconst COMMAND_IMPLEMENTATIONS: Record<string, string> = {};\nconst BLOCK_IMPLEMENTATIONS: Record<string, string> = {};\n\nfor (const [name, code] of Object.entries(COMMAND_IMPL_TS)) {\n COMMAND_IMPLEMENTATIONS[name] = stripTypes(code);\n}\n\nfor (const [name, code] of Object.entries(BLOCK_IMPL_TS)) {\n BLOCK_IMPLEMENTATIONS[name] = stripTypes(code);\n}\n\n/**\n * Generate bundle code from configuration\n */\nfunction generateBundleCode(config: GeneratorOptions): string {\n const {\n name,\n commands,\n blocks = [],\n htmxIntegration = false,\n globalName = 'hyperfixi',\n positionalExpressions = false,\n autoInit = true,\n esModule = true,\n parserType = 'hybrid',\n } = config;\n\n const needsStyleHelpers = commands.some(cmd => STYLE_COMMANDS.includes(cmd));\n const needsElementArrayHelper = commands.some(cmd => ELEMENT_ARRAY_COMMANDS.includes(cmd));\n const needsMorphlex = commands.some(cmd => MORPH_COMMANDS.includes(cmd));\n const hasBlocks = blocks.length > 0;\n const hasReturn = commands.includes('return');\n\n const commandCases = commands\n .filter(cmd => COMMAND_IMPLEMENTATIONS[cmd])\n .map(cmd => COMMAND_IMPLEMENTATIONS[cmd])\n .join('\\n');\n\n const blockCases = blocks\n .filter(block => BLOCK_IMPLEMENTATIONS[block])\n .map(block => BLOCK_IMPLEMENTATIONS[block])\n .join('\\n');\n\n // Select parser template based on type\n const parserTemplate = parserType === 'lite' ? LITE_PARSER_TEMPLATE : HYBRID_PARSER_TEMPLATE;\n\n // Morphlex import for DOM morphing\n const morphlexImport = needsMorphlex\n ? `import { morph as morphlexMorph, morphInner as morphlexMorphInner } from 'morphlex';\\n\\n`\n : '';\n\n return `/**\n * LokaScript ${name} Bundle (Auto-Generated)\n *\n * Generated by: @hyperfixi/vite-plugin\n * Parser: ${parserType}\n * Commands: ${commands.join(', ')}${blocks.length > 0 ? `\\n * Blocks: ${blocks.join(', ')}` : ''}${positionalExpressions ? '\\n * Positional expressions: enabled' : ''}${needsMorphlex ? '\\n * Morphing: morphlex (~2.5KB)' : ''}\n *\n * DO NOT EDIT - This file is automatically regenerated.\n */\n\n${morphlexImport}// Embedded ${parserType} parser (no external dependencies)\n${parserTemplate}\n\n// Runtime state\nconst globalVars = new Map();\n${hasBlocks ? 'const MAX_LOOP_ITERATIONS = 1000;' : ''}\n\nasync function evaluate(node, ctx) {\n switch (node.type) {\n case 'literal': return node.value;\n\n case 'identifier':\n if (node.value === 'me' || node.value === 'my') return ctx.me;\n if (node.value === 'it') return ctx.it;\n if (node.value === 'you') return ctx.you;\n if (node.value === 'event') return ctx.event;\n if (node.value === 'body') return document.body;\n if (node.value === 'document') return document;\n if (node.value === 'window') return window;\n if (ctx.locals.has(node.value)) return ctx.locals.get(node.value);\n if (node.value in ctx.me) return ctx.me[node.value];\n return node.value;\n\n case 'contextReference':\n // Semantic AST format for context references (me, you, it, etc.)\n switch (node.contextType || node.name) {\n case 'me': return ctx.me;\n case 'it': return ctx.it;\n case 'you': return ctx.you;\n case 'event': return ctx.event;\n case 'body': return document.body;\n case 'document': return document;\n case 'window': return window;\n default: return ctx.me;\n }\n\n case 'variable':\n if (node.scope === 'local') return ctx.locals.get(node.name.slice(1));\n const gName = node.name.slice(1);\n if (globalVars.has(gName)) return globalVars.get(gName);\n return window[node.name];\n\n case 'selector':\n const elements = document.querySelectorAll(node.value);\n return elements.length === 1 ? elements[0] : Array.from(elements);\n\n case 'binary':\n return evaluateBinary(node, ctx);\n\n case 'possessive':\n case 'member':\n const obj = await evaluate(node.object, ctx);\n if (obj == null) return undefined;\n const prop = node.computed ? await evaluate(node.property, ctx) : node.property;\n if (prop === 'values' && obj instanceof Element) {\n if (obj instanceof HTMLFormElement) return new FormData(obj);\n const fd = new FormData();\n obj.querySelectorAll('input, select, textarea').forEach(input => {\n const name = input.getAttribute('name');\n if (name && 'value' in input) fd.append(name, input.value);\n });\n return fd;\n }\n return obj[prop];\n\n case 'call': {\n let callContext = null;\n let callee;\n\n if (node.callee.type === 'member' || node.callee.type === 'possessive') {\n callContext = await evaluate(node.callee.object, ctx);\n const p = node.callee.computed\n ? await evaluate(node.callee.property, ctx)\n : node.callee.property;\n callee = callContext?.[p];\n } else {\n callee = await evaluate(node.callee, ctx);\n }\n\n const args = await Promise.all(node.args.map(a => evaluate(a, ctx)));\n if (typeof callee === 'function') return callee.apply(callContext, args);\n return undefined;\n }\n${\n positionalExpressions\n ? `\n case 'positional':\n return evaluatePositional(node, ctx);\n`\n : ''\n}\n default: return undefined;\n }\n}\n\nasync function evaluateBinary(node, ctx) {\n if (node.operator === 'has') {\n const left = await evaluate(node.left, ctx);\n if (left instanceof Element && node.right.type === 'selector' && node.right.value.startsWith('.')) {\n return left.classList.contains(node.right.value.slice(1));\n }\n return false;\n }\n\n const left = await evaluate(node.left, ctx);\n const right = await evaluate(node.right, ctx);\n\n switch (node.operator) {\n case '+': return left + right;\n case '-': return left - right;\n case '*': return left * right;\n case '/': return left / right;\n case '%': return left % right;\n case '==': case 'is': return left == right;\n case '!=': case 'is not': return left != right;\n case '<': return left < right;\n case '>': return left > right;\n case '<=': return left <= right;\n case '>=': return left >= right;\n case 'and': case '&&': return left && right;\n case 'or': case '||': return left || right;\n case 'contains': case 'includes':\n if (typeof left === 'string') return left.includes(right);\n if (Array.isArray(left)) return left.includes(right);\n if (left instanceof Element) return left.contains(right);\n return false;\n case 'matches':\n if (left instanceof Element) return left.matches(right);\n if (typeof left === 'string') return new RegExp(right).test(left);\n return false;\n default: return undefined;\n }\n}\n${\n positionalExpressions\n ? `\nfunction evaluatePositional(node, ctx) {\n const target = node.target;\n let elements = [];\n\n let selector = null;\n if (target.type === 'selector') {\n selector = target.value;\n } else if (target.type === 'identifier') {\n selector = target.value;\n } else if (target.type === 'htmlSelector') {\n selector = target.value;\n }\n if (selector) {\n elements = Array.from(document.querySelectorAll(selector));\n }\n\n switch (node.position) {\n case 'first': return elements[0] || null;\n case 'last': return elements[elements.length - 1] || null;\n case 'next': return ctx.me.nextElementSibling;\n case 'previous': return ctx.me.previousElementSibling;\n case 'closest': return target.value ? ctx.me.closest(target.value) : null;\n case 'parent': return ctx.me.parentElement;\n default: return elements[0] || null;\n }\n}\n`\n : ''\n}\n${\n needsStyleHelpers\n ? `\nconst isStyleProp = (prop) => prop?.startsWith('*');\nconst getStyleName = (prop) => prop.substring(1);\nconst setStyleProp = (el, prop, value) => {\n if (!isStyleProp(prop)) return false;\n el.style.setProperty(getStyleName(prop), String(value));\n return true;\n};\n`\n : ''\n}\n\n${\n needsElementArrayHelper\n ? `\nconst toElementArray = (val) => {\n if (Array.isArray(val)) return val.filter(e => e instanceof Element);\n if (val instanceof Element) return [val];\n if (typeof val === 'string') return Array.from(document.querySelectorAll(val));\n return [];\n};\n`\n : ''\n}\n\nasync function executeCommand(cmd, ctx) {\n const getTarget = async () => {\n // Support both HybridParser (cmd.target) and semantic AST (cmd.modifiers.on) formats\n const target = cmd.target || cmd.modifiers?.on;\n if (!target) return [ctx.me];\n const t = await evaluate(target, ctx);\n if (Array.isArray(t)) return t;\n if (t instanceof Element) return [t];\n if (typeof t === 'string') return Array.from(document.querySelectorAll(t));\n return [ctx.me];\n };\n\n const getClassName = (node) => {\n if (!node) return '';\n if (node.type === 'selector') return node.value.slice(1);\n if (node.type === 'string' || node.type === 'literal') {\n const val = node.value;\n return typeof val === 'string' && val.startsWith('.') ? val.slice(1) : String(val);\n }\n if (node.type === 'identifier') return node.value;\n return '';\n };\n\n switch (cmd.name) {\n${commandCases}\n\n default:\n console.warn(\\`${name} bundle: Unknown command '\\${cmd.name}'\\`);\n return null;\n }\n}\n${\n hasBlocks\n ? `\nasync function executeBlock(block, ctx) {\n switch (block.type) {\n${blockCases}\n\n default:\n console.warn(\\`${name} bundle: Unknown block '\\${block.type}'\\`);\n return null;\n }\n}\n`\n : ''\n}\nasync function executeSequence(nodes, ctx) {\n let result;\n for (const node of nodes) {\n if (node.type === 'command') {\n result = await executeCommand(node, ctx);\n }${\n hasBlocks\n ? ` else if (['if', 'repeat', 'for', 'while', 'fetch'].includes(node.type)) {\n result = await executeBlock(node, ctx);\n }`\n : ''\n }\n }\n return result;\n}\n${\n hasBlocks\n ? `\nasync function executeSequenceWithBlocks(nodes, ctx) {\n try {\n return await executeSequence(nodes, ctx);\n } catch (e) {\n if (e?.type === 'return') throw e;\n throw e;\n }\n}\n`\n : ''\n}\nasync function executeAST(ast, me, event) {\n const ctx = { me, event, locals: new Map() };\n\n if (ast.type === 'sequence') {\n ${hasReturn || hasBlocks ? \"try { return await executeSequence(ast.commands, ctx); } catch (e) { if (e?.type === 'return') return e.value; throw e; }\" : 'return executeSequence(ast.commands, ctx);'}\n }\n\n if (ast.type === 'event') {\n const eventNode = ast;\n const eventName = eventNode.event;\n\n if (eventName === 'init') {\n ${hasReturn || hasBlocks ? \"try { await executeSequence(eventNode.body, ctx); } catch (e) { if (e?.type !== 'return') throw e; }\" : 'await executeSequence(eventNode.body, ctx);'}\n return;\n }\n\n const target = eventNode.filter ? await evaluate(eventNode.filter, ctx) : me;\n const targetEl = target instanceof Element ? target : me;\n const mods = eventNode.modifiers;\n\n let handler = async (e) => {\n if (mods.prevent) e.preventDefault();\n if (mods.stop) e.stopPropagation();\n\n const handlerCtx = {\n me, event: e,\n you: e.target instanceof Element ? e.target : undefined,\n locals: new Map(),\n };\n ${hasReturn || hasBlocks ? \"try { await executeSequence(eventNode.body, handlerCtx); } catch (err) { if (err?.type !== 'return') throw err; }\" : 'await executeSequence(eventNode.body, handlerCtx);'}\n };\n\n if (mods.debounce) {\n let timeout;\n const orig = handler;\n handler = async (e) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => orig(e), mods.debounce);\n };\n }\n\n if (mods.throttle) {\n let lastCall = 0;\n const orig = handler;\n handler = async (e) => {\n const now = Date.now();\n if (now - lastCall >= mods.throttle) {\n lastCall = now;\n await orig(e);\n }\n };\n }\n\n targetEl.addEventListener(eventName, handler, { once: !!mods.once });\n return;\n }\n\n // Handle single command (not wrapped in event or sequence)\n if (ast.type === 'command') {\n return executeCommand(ast, ctx);\n }\n\n return null;\n}\n\nfunction processElement(el) {\n const code = el.getAttribute('_');\n if (!code) return;\n\n try {\n const ast = ${parserType === 'lite' ? 'parseLite(code)' : 'new HybridParser(code).parse()'};\n executeAST(ast, el);\n } catch (err) {\n console.error('LokaScript ${name} error:', err, 'Code:', code);\n }\n}\n\nfunction processElements(root = document) {\n const elements = root.querySelectorAll('[_]');\n elements.forEach(processElement);\n}\n\nconst api = {\n version: '1.0.0-${name.toLowerCase().replace(/\\s+/g, '-')}',\n\n parse(code) {\n return ${parserType === 'lite' ? 'parseLite(code)' : 'new HybridParser(code).parse()'};\n },\n\n async execute(code, element) {\n const me = element || document.body;\n const ast = ${parserType === 'lite' ? 'parseLite(code)' : 'new HybridParser(code).parse()'};\n return executeAST(ast, me);\n },\n\n run: async (code, element) => api.execute(code, element),\n eval: async (code, element) => api.execute(code, element),\n\n init: processElements,\n process: processElements,\n\n commands: ${JSON.stringify(commands)},\n ${blocks.length > 0 ? `blocks: ${JSON.stringify(blocks)},` : ''}\n parserName: '${parserType}',\n};\n${\n autoInit\n ? `\nif (typeof window !== 'undefined') {\n window.${globalName} = api;\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => processElements());\n } else {\n processElements();\n }\n${\n htmxIntegration\n ? `\n document.addEventListener('htmx:afterSettle', (e) => {\n const target = e.detail?.target;\n if (target) processElements(target);\n });\n`\n : ''\n}\n}\n`\n : ''\n}\n${\n esModule\n ? `\nexport default api;\nexport { api, processElements };\n`\n : ''\n}`;\n}\n\n// =============================================================================\n// GENERATOR CLASS\n// =============================================================================\n\n/**\n * Generator class for creating minimal bundles\n */\nexport class Generator {\n private debug: boolean;\n\n constructor(options: Pick<HyperfixiPluginOptions, 'debug'>) {\n this.debug = options.debug ?? false;\n }\n\n /**\n * Generate bundle code from aggregated usage\n */\n generate(usage: AggregatedUsage, options: HyperfixiPluginOptions): string {\n const commands = [...usage.commands, ...(options.extraCommands ?? [])];\n const blocks = [...usage.blocks, ...(options.extraBlocks ?? [])];\n const positional = usage.positional || options.positional || false;\n\n // Resolve semantic configuration\n const semanticConfig = resolveSemanticConfig(options, usage.detectedLanguages);\n\n // If no usage detected and no semantic, return empty module\n if (commands.length === 0 && blocks.length === 0 && !positional && !semanticConfig.enabled) {\n return this.generateEmptyBundle(options);\n }\n\n // htmx v4 reactive/streaming features: the minimal generator's slim\n // runtime can't satisfy these (its `set` doesn't fire notifyGlobalWrite,\n // it has no live/when/bind features, and SSE/WS modules aren't wired).\n // Route to the `hx-v4` bundle which bundles everything correctly.\n const needsV4Bundle =\n usage.needsReactivity ||\n usage.htmx?.needsHxLive ||\n usage.htmx?.needsSSE ||\n usage.htmx?.needsWS;\n if (needsV4Bundle) {\n if (this.debug) {\n const triggers: string[] = [];\n if (usage.htmx?.needsHxLive) triggers.push('hx-live');\n if (usage.htmx?.needsSSE) triggers.push('sse-connect/sse-swap');\n if (usage.htmx?.needsWS) triggers.push('ws-connect/ws-send');\n if (usage.needsBindToProperty) triggers.push('bind-to-property');\n else if (usage.needsReactivity) triggers.push('live/when/bind in _=');\n console.log(\n `[hyperfixi] Detected htmx v4 features: ${triggers.join(', ')}\\n` +\n ` Using the hx-v4 premade bundle (auto-installs reactivity + SSE/WS).`\n );\n // Reactivity-only users currently still get the full hx-v4 bundle —\n // a more granular fallback is feasible but deferred until size\n // feedback warrants the maintenance lift. See memory entry\n // project_parked_vite_plugin_reactivity_only_bundle for the\n // implementation shape and trigger conditions.\n const onlyReactivity =\n usage.needsReactivity &&\n !usage.htmx?.needsHxLive &&\n !usage.htmx?.needsSSE &&\n !usage.htmx?.needsWS &&\n !usage.htmx?.hasHtmxAttributes;\n if (onlyReactivity) {\n console.log(\n ` Note: this project uses reactivity only (no hx-*/sse-*/ws-* attributes). ` +\n `A reactivity-only fallback is parked pending size feedback.`\n );\n }\n }\n return this.generateDevFallback('hx-v4');\n }\n\n // Check for commands that require full runtime - if found, fall back to full bundle\n const unsupportedCommands = this.getUnsupportedCommands(commands);\n if (unsupportedCommands.length > 0) {\n if (this.debug) {\n console.log(\n `[hyperfixi] Commands detected that require full runtime: ${unsupportedCommands.join(', ')}\\n` +\n ` Falling back to full browser bundle for complete functionality.`\n );\n }\n return this.generateDevFallback('full');\n }\n\n // Select parser type: use lite if possible for smaller bundles\n const parserType = canUseLiteParser(commands, blocks, positional) ? 'lite' : 'hybrid';\n\n const config: GeneratorOptions = {\n name: options.bundleName ?? 'ViteAutoGenerated',\n commands,\n blocks,\n positionalExpressions: positional,\n htmxIntegration: options.htmx ?? usage.htmx?.hasHtmxAttributes ?? false,\n globalName: options.globalName ?? 'hyperfixi',\n parserType,\n autoInit: true,\n esModule: true,\n };\n\n if (this.debug) {\n const bundleInfo: Record<string, unknown> = {\n commands,\n blocks,\n positional,\n htmx: config.htmxIntegration,\n semantic: semanticConfig.enabled,\n parserType,\n };\n\n if (semanticConfig.enabled && semanticConfig.bundleType) {\n const sizeInfo = getSemanticBundleSize(semanticConfig.bundleType);\n bundleInfo.semanticBundle = semanticConfig.bundleType;\n bundleInfo.semanticSize = sizeInfo.gzip;\n bundleInfo.languages = [...semanticConfig.languages];\n bundleInfo.grammar = semanticConfig.grammarEnabled;\n }\n\n console.log('[hyperfixi] Generating bundle:', bundleInfo);\n\n // Warn if semantic bundle is large\n if (semanticConfig.bundleType === 'all' || semanticConfig.bundleType === 'priority') {\n console.log(\n `[hyperfixi] Note: Using '${semanticConfig.bundleType}' semantic bundle (${getSemanticBundleSize(semanticConfig.bundleType).gzip}). ` +\n `Consider using 'region' option to select a smaller regional bundle if all languages aren't needed.`\n );\n }\n }\n\n // Generate base bundle code\n let bundleCode = generateBundleCode(config);\n\n // Add semantic integration if enabled\n if (semanticConfig.enabled) {\n bundleCode = this.addSemanticIntegration(bundleCode, semanticConfig);\n }\n\n return bundleCode;\n }\n\n /**\n * Add semantic integration code to the bundle\n */\n private addSemanticIntegration(bundleCode: string, config: SemanticConfig): string {\n const semanticCode = generateSemanticIntegrationCode(config);\n const semanticExports = getSemanticExports(config);\n\n // Insert semantic imports after the parser imports\n const parserImportEnd = bundleCode.indexOf('// Runtime state');\n if (parserImportEnd === -1) {\n // Fallback: prepend to code\n bundleCode = semanticCode + '\\n' + bundleCode;\n } else {\n bundleCode =\n bundleCode.slice(0, parserImportEnd) +\n semanticCode +\n '\\n\\n' +\n bundleCode.slice(parserImportEnd);\n }\n\n // Replace parser usage with parseWithSemantic in processElement\n // Matches both: `const ast = new HybridParser(code).parse();` and `const ast = parseLite(code);`\n bundleCode = bundleCode.replace(\n /function processElement\\(el\\) \\{\\s*const code = el\\.getAttribute\\('_'\\);\\s*if \\(!code\\) return;\\s*try \\{\\s*const ast = (?:new HybridParser\\(code\\)\\.parse\\(\\)|parseLite\\(code\\));/g,\n `function processElement(el) {\n const code = el.getAttribute('_');\n if (!code) return;\n\n try {\n const ast = parseWithSemantic(code);`\n );\n\n // Replace parser usage in api.parse\n // Matches both: `return new HybridParser(code).parse();` and `return parseLite(code);`\n bundleCode = bundleCode.replace(\n /parse\\(code\\) \\{\\s*return (?:new HybridParser\\(code\\)\\.parse\\(\\)|parseLite\\(code\\));/g,\n `parse(code, lang = null) {\n return parseWithSemantic(code, lang);`\n );\n\n // Replace parser usage in api.execute\n // Matches both: `const ast = new HybridParser(code).parse();` and `const ast = parseLite(code);`\n bundleCode = bundleCode.replace(\n /async execute\\(code, element\\) \\{\\s*const me = element \\|\\| document\\.body;\\s*const ast = (?:new HybridParser\\(code\\)\\.parse\\(\\)|parseLite\\(code\\));/g,\n `async execute(code, element, lang = null) {\n const me = element || document.body;\n const ast = parseWithSemantic(code, lang);`\n );\n\n // Add semantic exports to the api object\n if (semanticExports.length > 0) {\n // Match parserName with either 'lite' or 'hybrid' value\n const apiExportsMarkerRegex = /parserName: '(?:lite|hybrid)',/;\n const additionalApiProps = semanticExports.map(exp => ` ${exp},`).join('\\n');\n bundleCode = bundleCode.replace(\n apiExportsMarkerRegex,\n `parserName: 'semantic',\\n${additionalApiProps}`\n );\n }\n\n return bundleCode;\n }\n\n /**\n * Get commands that require the full runtime and are not available in generated bundles\n */\n private getUnsupportedCommands(commands: string[]): string[] {\n const unsupported: string[] = [];\n\n for (const cmd of commands) {\n if (FULL_RUNTIME_ONLY_COMMANDS.includes(cmd as (typeof FULL_RUNTIME_ONLY_COMMANDS)[number])) {\n unsupported.push(cmd);\n } else if (!isAvailableCommand(cmd) && !COMMAND_IMPLEMENTATIONS[cmd]) {\n // Command exists but has no implementation in lite bundles\n unsupported.push(cmd);\n }\n }\n\n return unsupported;\n }\n\n /**\n * Check if any commands require full runtime and should trigger fallback\n */\n requiresFullRuntime(commands: string[]): boolean {\n return this.getUnsupportedCommands(commands).length > 0;\n }\n\n /**\n * Generate an empty bundle when no hyperscript is detected\n */\n private generateEmptyBundle(options: HyperfixiPluginOptions): string {\n const globalName = options.globalName ?? 'hyperfixi';\n\n return `/**\n * LokaScript Empty Bundle (Auto-Generated)\n *\n * No hyperscript usage detected. This bundle provides a minimal API.\n * Add hyperscript attributes (_=\"...\") to your HTML to enable features.\n *\n * Generated by: @hyperfixi/vite-plugin\n */\n\nconst api = {\n version: '1.0.0-empty',\n commands: [],\n parserName: 'none',\n\n parse() {\n console.warn('LokaScript: No parser loaded. Add hyperscript to your HTML to enable parsing.');\n return { type: 'empty' };\n },\n\n async execute(code, element) {\n console.warn('LokaScript: No commands loaded. Detected commands will be automatically included.');\n return null;\n },\n\n run: async (code, element) => api.execute(code, element),\n eval: async (code, element) => api.execute(code, element),\n\n init() {},\n process() {},\n};\n\nif (typeof window !== 'undefined') {\n (window).${globalName} = api;\n}\n\nexport default api;\nexport { api };\n`;\n }\n\n /**\n * Generate a development fallback bundle.\n *\n * `hx-v4` re-exports the htmx v4 surface bundle: full runtime +\n * htmx-compat + reactivity (hx-live, bind, when) + SSE + WS, all\n * auto-installed. The vite plugin selects this when scanner detects\n * any of `hx-live`, `sse-connect`/`sse-swap`, `ws-connect`/`ws-send`,\n * or `bind ... to <expr>.<prop>` in `_=` bodies — the minimal\n * generator can't satisfy those features (the slim runtime lacks the\n * reactive notify chain and the SSE/WS modules). Larger artifact but\n * correct end-to-end.\n */\n generateDevFallback(fallback: 'hybrid-complete' | 'full' | 'hx-v4'): string {\n const bundle =\n fallback === 'full'\n ? '@hyperfixi/core/browser'\n : fallback === 'hx-v4'\n ? '@hyperfixi/core/browser/hybrid-hx-v4'\n : '@hyperfixi/core/browser/hybrid-complete';\n\n return `/**\n * LokaScript Dev Fallback Bundle\n *\n * Using pre-built ${fallback} bundle for faster development.\n * Production builds will generate minimal bundles.\n *\n * Generated by: @hyperfixi/vite-plugin\n */\n\nexport * from '${bundle}';\nexport { default } from '${bundle}';\n`;\n }\n}\n","/**\n * Semantic Integration\n *\n * Handles semantic bundle selection and integration layer generation.\n * Used when multilingual semantic support is enabled.\n */\n\nimport type { HyperfixiPluginOptions } from './types';\nimport { REGIONS, type SupportedLanguage } from './language-keywords';\n\n/**\n * Multilingual command aliases.\n * Maps non-English command keywords to their English equivalents.\n */\nconst MULTILINGUAL_COMMAND_ALIASES: Partial<Record<SupportedLanguage, Record<string, string>>> = {\n ja: {\n トグル: 'toggle',\n 切り替え: 'toggle',\n 追加: 'add',\n 削除: 'remove',\n 表示: 'show',\n 隠す: 'hide',\n 非表示: 'hide',\n 設定: 'set',\n セット: 'set',\n 増加: 'increment',\n 減少: 'decrement',\n ログ: 'log',\n 出力: 'log',\n },\n ko: {\n 토글: 'toggle',\n 전환: 'toggle',\n 추가: 'add',\n 제거: 'remove',\n 삭제: 'remove',\n 표시: 'show',\n 숨기다: 'hide',\n 설정: 'set',\n 증가: 'increment',\n 감소: 'decrement',\n 로그: 'log',\n },\n zh: {\n 切换: 'toggle',\n 添加: 'add',\n 移除: 'remove',\n 删除: 'remove',\n 显示: 'show',\n 隐藏: 'hide',\n 设置: 'set',\n 设定: 'set',\n 增加: 'increment',\n 减少: 'decrement',\n 日志: 'log',\n 记录: 'log',\n },\n ar: {\n بدّل: 'toggle',\n بدل: 'toggle',\n أضف: 'add',\n اضف: 'add',\n أزل: 'remove',\n ازل: 'remove',\n احذف: 'remove',\n أظهر: 'show',\n اظهر: 'show',\n أخفِ: 'hide',\n اخف: 'hide',\n ضع: 'set',\n اضع: 'set',\n زِد: 'increment',\n أنقص: 'decrement',\n },\n es: {\n alternar: 'toggle',\n añadir: 'add',\n agregar: 'add',\n quitar: 'remove',\n eliminar: 'remove',\n mostrar: 'show',\n ocultar: 'hide',\n esconder: 'hide',\n establecer: 'set',\n fijar: 'set',\n incrementar: 'increment',\n decrementar: 'decrement',\n },\n pt: {\n alternar: 'toggle',\n adicionar: 'add',\n remover: 'remove',\n mostrar: 'show',\n esconder: 'hide',\n ocultar: 'hide',\n definir: 'set',\n incrementar: 'increment',\n decrementar: 'decrement',\n },\n fr: {\n basculer: 'toggle',\n ajouter: 'add',\n supprimer: 'remove',\n retirer: 'remove',\n afficher: 'show',\n montrer: 'show',\n cacher: 'hide',\n masquer: 'hide',\n définir: 'set',\n incrémenter: 'increment',\n décrémenter: 'decrement',\n },\n de: {\n umschalten: 'toggle',\n hinzufügen: 'add',\n entfernen: 'remove',\n löschen: 'remove',\n anzeigen: 'show',\n zeigen: 'show',\n verbergen: 'hide',\n verstecken: 'hide',\n setzen: 'set',\n festlegen: 'set',\n erhöhen: 'increment',\n verringern: 'decrement',\n },\n tr: {\n değiştir: 'toggle',\n değistir: 'toggle',\n ekle: 'add',\n kaldır: 'remove',\n kaldir: 'remove',\n sil: 'remove',\n göster: 'show',\n gizle: 'hide',\n sakla: 'hide',\n ayarla: 'set',\n belirle: 'set',\n arttır: 'increment',\n azalt: 'decrement',\n },\n id: {\n alih: 'toggle',\n beralih: 'toggle',\n tambah: 'add',\n hapus: 'remove',\n buang: 'remove',\n tampilkan: 'show',\n sembunyikan: 'hide',\n atur: 'set',\n tetapkan: 'set',\n tambahkan: 'increment',\n kurangi: 'decrement',\n },\n sw: {\n badilisha: 'toggle',\n ongeza: 'add',\n ondoa: 'remove',\n futa: 'remove',\n onyesha: 'show',\n ficha: 'hide',\n weka: 'set',\n sanidi: 'set',\n ongezea: 'increment',\n punguza: 'decrement',\n },\n qu: {\n tikray: 'toggle',\n yapay: 'add',\n qichuy: 'remove',\n pichay: 'remove',\n rikuchiy: 'show',\n pakay: 'hide',\n churay: 'set',\n pisiyachiy: 'decrement',\n },\n};\n\n/**\n * Get multilingual command aliases for detected languages.\n * Used by compile mode to configure the compiler with the right aliases.\n */\nexport function getMultilingualCommandAliases(\n languages: Set<SupportedLanguage>\n): Record<string, string> {\n const aliases: Record<string, string> = {};\n\n for (const lang of languages) {\n const langAliases = MULTILINGUAL_COMMAND_ALIASES[lang];\n if (langAliases) {\n Object.assign(aliases, langAliases);\n }\n }\n\n return aliases;\n}\n\n/**\n * Generate code to add multilingual command aliases to HybridParser.\n */\nfunction generateMultilingualAliases(languages: Set<SupportedLanguage>): string {\n const aliases: Record<string, string> = {};\n\n for (const lang of languages) {\n const langAliases = MULTILINGUAL_COMMAND_ALIASES[lang];\n if (langAliases) {\n Object.assign(aliases, langAliases);\n }\n }\n\n if (Object.keys(aliases).length === 0) {\n return `\n// No multilingual aliases needed - just pass through\nfunction preprocessMultilingual(code) { return code; }\n`;\n }\n\n // Generate code to add aliases to HybridParser via addCommandAliases\n const aliasEntries = Object.entries(aliases)\n .map(([key, val]) => ` '${key}': '${val}'`)\n .join(',\\n');\n\n // Build regex pattern to match multilingual keywords\n // Escape special regex characters in keys\n const escapedKeys = Object.keys(aliases)\n .map(k => k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('|');\n\n return `\n// Multilingual command aliases for HybridParser fallback\nconst MULTILINGUAL_ALIASES = {\n${aliasEntries}\n};\n\n// Register multilingual aliases with the parser\naddCommandAliases(MULTILINGUAL_ALIASES);\n\n// Preprocessing regex to translate multilingual keywords to English\n// The HybridParser tokenizer only accepts ASCII identifiers, so we need\n// to translate non-ASCII keywords before parsing.\nconst MULTILINGUAL_KEYWORD_REGEX = new RegExp('(^|\\\\\\\\s)(${escapedKeys})(?=\\\\\\\\s|\\\\\\\\.|$)', 'g');\n\n/**\n * Preprocess multilingual code to replace non-ASCII keywords with English equivalents.\n * This is needed because HybridParser's tokenizer only accepts ASCII identifiers.\n */\nfunction preprocessMultilingual(code) {\n return code.replace(MULTILINGUAL_KEYWORD_REGEX, (match, prefix, keyword) => {\n const english = MULTILINGUAL_ALIASES[keyword];\n return english ? prefix + english : match;\n });\n}\n`;\n}\n\n/**\n * Semantic bundle types available.\n * Single-language bundles are available for all 25 languages with semantic tokenizers.\n */\nexport type SemanticBundleType =\n // Single-language bundles (all 25 languages)\n | 'ar'\n | 'bn'\n | 'de'\n | 'en'\n | 'es'\n | 'fr'\n | 'he'\n | 'hi'\n | 'id'\n | 'it'\n | 'ja'\n | 'ko'\n | 'ms'\n | 'pl'\n | 'pt'\n | 'qu'\n | 'ru'\n | 'sw'\n | 'th'\n | 'tl'\n | 'tr'\n | 'uk'\n | 'vi'\n | 'zh'\n // Regional bundles\n | 'es-en'\n | 'western'\n | 'east-asian'\n | 'priority'\n | 'all';\n\n/**\n * Semantic configuration resolved from options and detected languages.\n */\nexport interface SemanticConfig {\n /** Whether semantic parsing is enabled */\n enabled: boolean;\n\n /** Which semantic bundle to use */\n bundleType: SemanticBundleType | null;\n\n /** All languages to support (detected + explicit) */\n languages: Set<SupportedLanguage>;\n\n /** Whether grammar transformation is enabled */\n grammarEnabled: boolean;\n}\n\n/**\n * Resolve semantic configuration from plugin options and detected languages.\n */\nexport function resolveSemanticConfig(\n options: HyperfixiPluginOptions,\n detectedLanguages: Set<string>\n): SemanticConfig {\n // Check if grammar is enabled (which implies semantic)\n const grammarEnabled = options.grammar ?? false;\n\n // Determine if semantic is enabled\n let semanticEnabled = grammarEnabled; // grammar implies semantic\n if (options.semantic === true || options.semantic === 'auto') {\n semanticEnabled = true;\n } else if (options.semantic === 'en') {\n semanticEnabled = true;\n } else if (options.semantic === false) {\n semanticEnabled = false;\n }\n\n // If not enabled, return early\n if (!semanticEnabled) {\n return {\n enabled: false,\n bundleType: null,\n languages: new Set(),\n grammarEnabled: false,\n };\n }\n\n // Collect all languages\n const languages = new Set<SupportedLanguage>();\n\n // Add detected languages\n for (const lang of detectedLanguages) {\n languages.add(lang as SupportedLanguage);\n }\n\n // Add explicitly configured languages\n if (options.languages) {\n for (const lang of options.languages) {\n languages.add(lang as SupportedLanguage);\n }\n }\n\n // Add extra languages\n if (options.extraLanguages) {\n for (const lang of options.extraLanguages) {\n languages.add(lang as SupportedLanguage);\n }\n }\n\n // Determine bundle type\n let bundleType = selectBundleType(options, languages);\n\n return {\n enabled: true,\n bundleType,\n languages,\n grammarEnabled,\n };\n}\n\n/**\n * Select the optimal semantic bundle type based on options and languages.\n */\nfunction selectBundleType(\n options: HyperfixiPluginOptions,\n languages: Set<SupportedLanguage>\n): SemanticBundleType {\n // If explicit region is set, use it\n if (options.region) {\n return options.region as SemanticBundleType;\n }\n\n // If semantic is 'en', use English-only bundle\n if (options.semantic === 'en') {\n return 'en';\n }\n\n // If explicit languages are set, find optimal bundle\n if (options.languages?.length) {\n return selectOptimalBundle(new Set(options.languages as SupportedLanguage[]));\n }\n\n // Use detected languages\n if (languages.size === 0) {\n // No languages detected, default to English\n return 'en';\n }\n\n return selectOptimalBundle(languages);\n}\n\n/**\n * All languages that have single-language ESM modules available.\n * These can be selected as individual bundle types for optimal tree-shaking.\n */\nconst SINGLE_LANGUAGE_BUNDLES: readonly string[] = [\n 'ar',\n 'bn',\n 'de',\n 'en',\n 'es',\n 'fr',\n 'he',\n 'hi',\n 'id',\n 'it',\n 'ja',\n 'ko',\n 'ms',\n 'pl',\n 'pt',\n 'qu',\n 'ru',\n 'sw',\n 'th',\n 'tl',\n 'tr',\n 'uk',\n 'vi',\n 'zh',\n] as const;\n\n/**\n * Select the smallest bundle that covers all specified languages.\n */\nexport function selectOptimalBundle(languages: Set<SupportedLanguage>): SemanticBundleType {\n if (languages.size === 0) {\n return 'en';\n }\n\n const langArray = [...languages];\n\n // Check single-language bundles (all 13 languages have individual bundles)\n if (langArray.length === 1) {\n const lang = langArray[0];\n if (SINGLE_LANGUAGE_BUNDLES.includes(lang)) {\n return lang as SemanticBundleType;\n }\n }\n\n // Check if en + es covers it (common bilingual case)\n if (langArray.length === 2 && langArray.includes('en') && langArray.includes('es')) {\n return 'es-en';\n }\n\n // Check if all languages fit in western bundle\n if (langArray.every(l => REGIONS.western.includes(l))) {\n return 'western';\n }\n\n // Check if all languages fit in east-asian bundle\n if (langArray.every(l => REGIONS['east-asian'].includes(l))) {\n return 'east-asian';\n }\n\n // Check if all languages fit in priority bundle\n if (langArray.every(l => REGIONS.priority.includes(l))) {\n return 'priority';\n }\n\n // Need full bundle\n return 'all';\n}\n\n/**\n * Estimated bundle sizes for each semantic bundle type.\n * Used for debug logging to help users understand size impact.\n * Sizes measured from minified bundles (January 2025).\n */\nexport const SEMANTIC_BUNDLE_SIZES: Record<SemanticBundleType, { raw: string; gzip: string }> = {\n // Single-language bundles (all 25 languages)\n ar: { raw: '66 KB', gzip: '~17 KB' },\n bn: { raw: '56 KB', gzip: '~14 KB' },\n de: { raw: '57 KB', gzip: '~14 KB' },\n en: { raw: '82 KB', gzip: '~20 KB' },\n es: { raw: '64 KB', gzip: '~16 KB' },\n fr: { raw: '57 KB', gzip: '~14 KB' },\n he: { raw: '56 KB', gzip: '~14 KB' },\n hi: { raw: '56 KB', gzip: '~14 KB' },\n id: { raw: '57 KB', gzip: '~14 KB' },\n it: { raw: '57 KB', gzip: '~14 KB' },\n ja: { raw: '67 KB', gzip: '~17 KB' },\n ko: { raw: '69 KB', gzip: '~18 KB' },\n ms: { raw: '56 KB', gzip: '~14 KB' },\n pl: { raw: '56 KB', gzip: '~14 KB' },\n pt: { raw: '56 KB', gzip: '~14 KB' },\n qu: { raw: '56 KB', gzip: '~14 KB' },\n ru: { raw: '56 KB', gzip: '~14 KB' },\n sw: { raw: '56 KB', gzip: '~14 KB' },\n th: { raw: '56 KB', gzip: '~14 KB' },\n tl: { raw: '56 KB', gzip: '~14 KB' },\n tr: { raw: '73 KB', gzip: '~18 KB' },\n uk: { raw: '56 KB', gzip: '~14 KB' },\n vi: { raw: '56 KB', gzip: '~14 KB' },\n zh: { raw: '58 KB', gzip: '~15 KB' },\n // Regional bundles\n 'es-en': { raw: '99 KB', gzip: '~25 KB' },\n western: { raw: '127 KB', gzip: '~30 KB' },\n 'east-asian': { raw: '99 KB', gzip: '~24 KB' },\n priority: { raw: '231 KB', gzip: '~48 KB' },\n all: { raw: '324 KB', gzip: '~61 KB' },\n};\n\n/**\n * Get the estimated size for a semantic bundle type.\n */\nexport function getSemanticBundleSize(bundleType: SemanticBundleType): {\n raw: string;\n gzip: string;\n} {\n return SEMANTIC_BUNDLE_SIZES[bundleType] ?? SEMANTIC_BUNDLE_SIZES.all;\n}\n\n/**\n * Languages that have per-language ESM subpath exports in @lokascript/semantic.\n * These can be imported individually: `import '@lokascript/semantic/languages/en'`\n *\n * All 25 languages with semantic tokenizers now have individual ESM modules.\n */\nconst LANGUAGES_WITH_ESM_EXPORTS = new Set([\n 'ar',\n 'bn',\n 'de',\n 'en',\n 'es',\n 'fr',\n 'he',\n 'hi',\n 'id',\n 'it',\n 'ja',\n 'ko',\n 'ms',\n 'pl',\n 'pt',\n 'qu',\n 'ru',\n 'sw',\n 'th',\n 'tl',\n 'tr',\n 'uk',\n 'vi',\n 'zh',\n]);\n\n/**\n * Get the import path for a semantic bundle type.\n *\n * For ES module usage (Vite, Rollup, etc.), we use '@lokascript/semantic/core'\n * which provides the core analyzer infrastructure without any language data.\n * Languages are imported separately as side-effect imports for tree-shaking.\n *\n * If any required language lacks an ESM subpath export, we fall back to the\n * full '@lokascript/semantic' entry which includes all languages.\n */\nexport function getSemanticBundleImport(_bundleType: SemanticBundleType): string {\n // Core entry provides createSemanticAnalyzer, buildAST, isLanguageSupported\n // without bundling any language data (~20 KB vs ~102 KB gzip)\n return '@lokascript/semantic/core';\n}\n\n/**\n * Resolve the set of language codes that need ESM imports for a given bundle type\n * and config languages.\n */\nexport function getLanguagesForBundleType(\n bundleType: SemanticBundleType,\n configLanguages: Set<SupportedLanguage>\n): Set<string> {\n const languages = new Set<string>(configLanguages);\n\n // Expand regional bundle types to their constituent languages\n switch (bundleType) {\n case 'western':\n REGIONS.western.forEach(l => languages.add(l));\n break;\n case 'east-asian':\n REGIONS['east-asian'].forEach(l => languages.add(l));\n break;\n case 'priority':\n REGIONS.priority.forEach(l => languages.add(l));\n break;\n case 'all':\n REGIONS.all.forEach(l => languages.add(l));\n break;\n case 'es-en':\n languages.add('en');\n languages.add('es');\n break;\n default:\n // Single language bundle type (e.g., 'en', 'ja') - add it\n if (typeof bundleType === 'string' && bundleType.length <= 3) {\n languages.add(bundleType);\n }\n break;\n }\n\n // Always ensure English is included as fallback\n languages.add('en');\n\n return languages;\n}\n\n/**\n * Check if all languages in the set have ESM subpath exports available.\n * @deprecated Use filterToAvailableLanguages() instead. This function used an\n * all-or-nothing approach that caused fallback to the full bundle when any\n * language lacked ESM exports. The new approach imports available languages\n * individually and skips unavailable ones.\n */\nexport function canUseCorePlusLanguages(languages: Set<string>): boolean {\n for (const lang of languages) {\n if (!LANGUAGES_WITH_ESM_EXPORTS.has(lang)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Filter a set of languages to only those with ESM subpath exports.\n * Languages without exports (e.g., 'it', 'ru', 'hi') are excluded since\n * they don't have semantic parser modules in @lokascript/semantic.\n *\n * Always ensures 'en' is included as a fallback.\n */\nexport function filterToAvailableLanguages(languages: Set<string>): Set<string> {\n const available = new Set<string>();\n for (const lang of languages) {\n if (LANGUAGES_WITH_ESM_EXPORTS.has(lang)) {\n available.add(lang);\n }\n }\n // Always ensure English is included\n available.add('en');\n return available;\n}\n\n/**\n * Generate the semantic integration layer code.\n * This is injected into the generated bundle when semantic is enabled.\n *\n * Always uses '@lokascript/semantic/core' for the analyzer infrastructure and\n * individual '@lokascript/semantic/languages/<lang>' imports for each\n * required language. Languages without ESM exports are skipped (they don't\n * have semantic parser modules). This avoids importing the full\n * '@lokascript/semantic' index (1 MB source) for multi-language scenarios.\n */\nexport function generateSemanticIntegrationCode(config: SemanticConfig): string {\n if (!config.enabled || !config.bundleType) {\n return '';\n }\n\n // Resolve all languages needed for this bundle type\n const resolvedLanguages = getLanguagesForBundleType(config.bundleType, config.languages);\n\n // Filter to only languages with ESM subpath exports.\n // Languages like 'it', 'ru', 'hi' don't have semantic parser modules\n // and would previously cause fallback to the full @lokascript/semantic\n // index (1 MB source). Now we always use core + per-language imports.\n const availableLanguages = filterToAvailableLanguages(resolvedLanguages);\n\n const languages = [...config.languages].join(\"', '\");\n\n let code = `\n// =============================================================================\n// SEMANTIC PARSER INTEGRATION\n// =============================================================================\n\n// Core infrastructure (no language data bundled)\nimport {\n parseWithConfidence,\n buildAST,\n isLanguageSupported,\n} from '@lokascript/semantic/core';\n\n// Register required languages (self-registering side-effect imports)\n`;\n // Sort for deterministic output\n const sortedLangs = [...availableLanguages].sort();\n for (const lang of sortedLangs) {\n code += `import '@lokascript/semantic/languages/${lang}';\\n`;\n }\n\n if (config.grammarEnabled) {\n // `translate` comes from the SAME module the parser above does. It used to be\n // `import { GrammarTransformer, translate } from '@lokascript/i18n'` — a second\n // translation stack in a bundle already carrying the semantic one, and one the\n // consumer had to install separately (this plugin depends on neither i18n nor\n // semantic directly; the generated code's imports are the user's to resolve).\n //\n // The i18n form was also DEAD ON ARRIVAL: `new GrammarTransformer()` passes no\n // `targetLocale`, and the constructor throws `Unknown target locale: undefined`\n // at module scope — so a `grammar: true` bundle failed on import. Nothing\n // caught it because the only test asserted `code).toContain('GrammarTransformer')`,\n // a string check on the generated text. The object was exported and never used.\n code += `\nimport { translate } from '@lokascript/semantic/core';\n`;\n }\n\n // Generate multilingual command aliases for HybridParser fallback\n const aliasesCode = generateMultilingualAliases(config.languages);\n\n code += `\nconst SUPPORTED_SEMANTIC_LANGUAGES = ['${languages}', 'en'];\nconst SEMANTIC_CONFIDENCE_THRESHOLD = 0.7;\n\n${aliasesCode}\n\n/**\n * Parse hyperscript using semantic parser with auto-language detection.\n * Tries each supported language until one returns a high-confidence result.\n * Falls back to HybridParser if none match.\n *\n * @param code - The hyperscript code to parse\n * @param lang - Optional language hint. If provided, tries this language first.\n */\nfunction parseWithSemantic(code, lang = null) {\n // Determine languages to try: specified lang first, then others\n let languagesToTry = [...SUPPORTED_SEMANTIC_LANGUAGES];\n if (lang && !languagesToTry.includes(lang)) {\n languagesToTry.unshift(lang);\n } else if (lang) {\n // Move specified lang to front\n languagesToTry = [lang, ...languagesToTry.filter(l => l !== lang)];\n }\n\n // Try each language until one succeeds\n for (const tryLang of languagesToTry) {\n if (!isLanguageSupported(tryLang)) continue;\n try {\n const result = parseWithConfidence(code, tryLang);\n if (result && result.confidence >= SEMANTIC_CONFIDENCE_THRESHOLD) {\n // buildAST returns {ast, warnings} - extract the ast\n const buildResult = buildAST(result.node);\n const ast = buildResult.ast;\n\n // Semantic parser doesn't fully handle event handlers - fallback to HybridParser\n // Event handlers like \"on click toggle .active\" produce incomplete AST\n if (ast && ast.type === 'command' && ast.name === 'on') {\n break; // Fallback to HybridParser\n }\n\n return ast;\n }\n } catch (e) {\n // Continue trying other languages\n }\n }\n\n // Fallback to HybridParser for event handlers and unrecognized patterns\n // Preprocess to translate non-ASCII keywords to English (tokenizer only accepts ASCII)\n const preprocessedCode = preprocessMultilingual(code);\n return new HybridParser(preprocessedCode).parse();\n}\n`;\n\n if (config.grammarEnabled) {\n code += `\n/**\n * Translate hyperscript between languages.\n *\n * Returns the input UNCHANGED when it cannot be parsed in \\`fromLang\\`, or when\n * \\`toLang\\` is not one of the languages this bundle registered. The semantic\n * translator throws in both cases; the i18n one this replaced never did — it\n * degraded to word substitution, which turned unparseable input into plausible\n * nonsense. Returning the source is the honest degradation.\n */\nfunction translateHyperscript(code, fromLang, toLang) {\n try {\n return translate(code, fromLang, toLang);\n } catch {\n return code;\n }\n}\n`;\n }\n\n return code;\n}\n\n/**\n * Get the list of exports to add when semantic is enabled.\n */\nexport function getSemanticExports(config: SemanticConfig): string[] {\n const exports: string[] = [];\n\n if (config.enabled) {\n exports.push('parseWithSemantic');\n exports.push('SUPPORTED_SEMANTIC_LANGUAGES');\n }\n\n if (config.grammarEnabled) {\n exports.push('translateHyperscript');\n }\n\n return exports;\n}\n","/**\n * Compiler\n *\n * Compiles hyperscript AST to JavaScript at build time.\n * Eliminates the need for runtime parsing.\n *\n * Multilingual support:\n * - For English: Uses HybridParser directly\n * - For other languages: Uses semantic parser to translate → AST → JavaScript\n * - Semantic parsing happens at BUILD time (zero runtime overhead)\n */\n\nimport { HybridParser } from '@hyperfixi/core/parser/hybrid/parser-core';\nimport type {\n ASTNode,\n CommandNode,\n EventNode,\n VariableNode,\n MemberNode,\n PossessiveNode,\n BinaryNode,\n CallNode,\n IdentifierNode,\n SelectorNode,\n LiteralNode,\n PositionalNode,\n} from '@hyperfixi/core/parser/hybrid/ast-types';\n\n// =============================================================================\n// SEMANTIC PARSER INTEGRATION (optional)\n// =============================================================================\n\n/**\n * Result shape returned by the semantic parse function.\n * Matches `ParseWithConfidenceResult` from `@lokascript/semantic`.\n */\ninterface SemanticParseResult {\n confidence: number;\n node?: unknown;\n error?: string | undefined;\n}\n\n/**\n * Function that parses input in a given language and returns a confidence\n * score plus an optional semantic node. Matches `parseSemantic` / `parseWithConfidence`\n * from `@lokascript/semantic`.\n */\ntype SemanticParseFn = (input: string, language: string) => SemanticParseResult;\n\n/**\n * Function that checks whether a language is registered for parsing.\n * Matches `isLanguageRegistered` from `@lokascript/semantic`.\n */\ntype SupportsLanguageFn = (language: string) => boolean;\n\ntype BuildASTFn = (node: unknown) => { ast: ASTNode; warnings: string[] };\n\n/**\n * Optional semantic parser for multilingual support.\n * Set via setSemanticParser() when semantic package is available.\n */\nlet semanticParse: SemanticParseFn | null = null;\nlet supportsLanguage: SupportsLanguageFn | null = null;\nlet buildASTFn: BuildASTFn | null = null;\n\n/**\n * Configure the semantic parser for multilingual compilation.\n *\n * @example\n * ```typescript\n * import { parseSemantic, isLanguageRegistered, buildAST } from '@lokascript/semantic';\n * import { setSemanticParser } from '@hyperfixi/vite-plugin';\n *\n * setSemanticParser(parseSemantic, isLanguageRegistered, buildAST);\n * ```\n */\nexport function setSemanticParser(\n parse: SemanticParseFn,\n supports: SupportsLanguageFn,\n buildAST: BuildASTFn\n): void {\n semanticParse = parse;\n supportsLanguage = supports;\n buildASTFn = buildAST;\n}\n\n/**\n * Clear the semantic parser (for testing).\n */\nexport function clearSemanticParser(): void {\n semanticParse = null;\n supportsLanguage = null;\n buildASTFn = null;\n}\n\n/**\n * Check if semantic parser is available.\n */\nexport function hasSemanticParser(): boolean {\n return semanticParse !== null && supportsLanguage !== null && buildASTFn !== null;\n}\n\n/**\n * Confidence threshold for using semantic parse results.\n */\nconst SEMANTIC_CONFIDENCE_THRESHOLD = 0.7;\n\n// =============================================================================\n// MULTILINGUAL PREPROCESSING\n// =============================================================================\n\n/**\n * Multilingual command aliases for preprocessing.\n * Maps non-ASCII keywords to English equivalents.\n */\nlet multilingualAliases: Record<string, string> = {};\nlet multilingualRegex: RegExp | null = null;\n\n/**\n * Configure multilingual aliases for preprocessing.\n * This allows compilation of non-ASCII keywords by translating them to English\n * before parsing with HybridParser.\n *\n * @example\n * ```typescript\n * setMultilingualAliases({\n * 'トグル': 'toggle',\n * '切り替え': 'toggle',\n * '追加': 'add',\n * 'alternar': 'toggle',\n * '토글': 'toggle',\n * });\n * ```\n */\nexport function setMultilingualAliases(aliases: Record<string, string>): void {\n multilingualAliases = { ...aliases };\n\n if (Object.keys(aliases).length > 0) {\n // Build regex pattern to match multilingual keywords\n const escapedKeys = Object.keys(aliases)\n .map(k => k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('|');\n multilingualRegex = new RegExp(`(^|\\\\s)(${escapedKeys})(?=\\\\s|\\\\.|$)`, 'g');\n } else {\n multilingualRegex = null;\n }\n}\n\n/**\n * Clear multilingual aliases (for testing).\n */\nexport function clearMultilingualAliases(): void {\n multilingualAliases = {};\n multilingualRegex = null;\n}\n\n/**\n * Get currently configured multilingual aliases.\n */\nexport function getMultilingualAliases(): Record<string, string> {\n return { ...multilingualAliases };\n}\n\n/**\n * Preprocess code to replace non-ASCII keywords with English equivalents.\n * This is needed because HybridParser's tokenizer only accepts ASCII identifiers.\n */\nfunction preprocessMultilingual(code: string): string {\n if (!multilingualRegex) return code;\n\n return code.replace(multilingualRegex, (match, prefix, keyword) => {\n const english = multilingualAliases[keyword];\n return english ? prefix + english : match;\n });\n}\n\n// =============================================================================\n// SANITIZATION UTILITIES\n// =============================================================================\n\n/**\n * Sanitize a class name for safe interpolation into JavaScript string literals.\n * Only allows valid CSS class name characters.\n */\nfunction sanitizeClassName(name: string): string | null {\n // CSS class names: must start with letter, underscore, or hyphen\n // followed by letters, digits, underscores, or hyphens\n if (!/^-?[a-zA-Z_][a-zA-Z0-9_-]*$/.test(name)) {\n return null; // Invalid class name - fall back to runtime\n }\n return name;\n}\n\n/**\n * Sanitize a CSS selector for safe interpolation into JavaScript string literals.\n * Escapes characters that could break out of string context.\n */\nfunction sanitizeSelector(selector: string): string {\n return selector\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes first\n .replace(/'/g, \"\\\\'\") // Escape single quotes\n .replace(/\\n/g, '\\\\n') // Escape newlines\n .replace(/\\r/g, '\\\\r') // Escape carriage returns\n .replace(/\\0/g, ''); // Remove null bytes\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface CompiledHandler {\n /** Unique handler ID (h0, h1, etc.) */\n id: string;\n\n /** Event name (click, input, etc.) */\n event: string;\n\n /** Event modifiers */\n modifiers: {\n prevent?: boolean;\n stop?: boolean;\n once?: boolean;\n debounce?: number;\n throttle?: number;\n };\n\n /** Compiled JavaScript code */\n code: string;\n\n /** Whether handler needs the mini-evaluator for dynamic expressions */\n needsEvaluator: boolean;\n\n /** Original hyperscript for debugging */\n original: string;\n}\n\nexport interface CompilationResult {\n /** All compiled handlers */\n handlers: CompiledHandler[];\n\n /** Whether any handler needs the expression evaluator */\n needsEvaluator: boolean;\n\n /** Whether any handler needs locals support */\n needsLocals: boolean;\n\n /** Whether any handler needs globals support */\n needsGlobals: boolean;\n\n /** Warnings during compilation */\n warnings: string[];\n\n /** Scripts that couldn't be compiled (need full runtime) */\n fallbacks: Array<{ id: string; script: string; reason: string }>;\n}\n\n// =============================================================================\n// COMPILER\n// =============================================================================\n\n/**\n * Simple hash function for generating stable handler IDs.\n * Uses djb2 algorithm - fast and produces good distribution.\n */\nfunction hashScript(script: string): string {\n let hash = 5381;\n for (let i = 0; i < script.length; i++) {\n hash = ((hash << 5) + hash) ^ script.charCodeAt(i);\n }\n // Convert to base36 for shorter IDs, take first 4 chars\n return Math.abs(hash).toString(36).slice(0, 4);\n}\n\n// Track used IDs to handle collisions\nconst usedIds = new Set<string>();\n\n/**\n * Reset compiler state (for testing and between builds)\n */\nexport function resetCompiler(): void {\n usedIds.clear();\n}\n\n/**\n * Generate a semantic handler ID based on event, command, and content hash.\n * Format: {event}_{command}_{hash}\n * Example: click_toggle_3a2b\n */\nfunction generateHandlerId(event: string, command: string, script: string): string {\n const hash = hashScript(script);\n let id = `${event}_${command}_${hash}`;\n\n // Handle unlikely hash collisions by appending a suffix\n let suffix = 0;\n while (usedIds.has(id)) {\n id = `${event}_${command}_${hash}${suffix++}`;\n }\n\n usedIds.add(id);\n return id;\n}\n\n/**\n * Compile options for multilingual support.\n */\nexport interface CompileOptions {\n /** Language code (ISO 639-1). Defaults to 'en'. */\n language?: string;\n /** Enable debug logging. */\n debug?: boolean;\n}\n\n/**\n * Compile a hyperscript string to JavaScript.\n *\n * For non-English languages, uses the semantic parser (if available)\n * to translate the input to an AST before compilation.\n *\n * @param script - The hyperscript code to compile\n * @param options - Compilation options including language\n * @returns Compiled handler or null if compilation failed\n */\nexport function compile(script: string, options: CompileOptions = {}): CompiledHandler | null {\n const { language = 'en', debug = false } = options;\n\n try {\n let ast: ASTNode;\n\n // For non-English, try semantic parser first\n if (language !== 'en' && semanticParse && supportsLanguage && buildASTFn) {\n if (supportsLanguage(language)) {\n const result = semanticParse(script, language);\n\n if (result.node && result.confidence >= SEMANTIC_CONFIDENCE_THRESHOLD) {\n const { ast: builtAST, warnings } = buildASTFn(result.node);\n\n if (debug && warnings.length > 0) {\n console.log(`[hyperfixi] Semantic AST warnings for \"${script}\":`, warnings);\n }\n\n ast = builtAST;\n\n if (debug) {\n console.log(\n `[hyperfixi] Compiled ${language}: \"${script}\" (confidence: ${result.confidence.toFixed(2)})`\n );\n }\n } else {\n // Semantic parsing failed or low confidence\n if (debug) {\n const reason = result.error || `low confidence (${result.confidence.toFixed(2)})`;\n console.log(`[hyperfixi] Semantic parse failed for \"${script}\": ${reason}`);\n }\n return null;\n }\n } else {\n // Language not supported by semantic parser\n if (debug) {\n console.log(`[hyperfixi] Language \"${language}\" not supported by semantic parser`);\n }\n return null;\n }\n } else if (language !== 'en') {\n // Non-English but no semantic parser available\n if (debug) {\n console.log(\n `[hyperfixi] Semantic parser not available for \"${language}\". Install @lokascript/semantic and call setSemanticParser().`\n );\n }\n return null;\n } else {\n // English or no semantic parser - use HybridParser with preprocessing\n // Preprocessing translates non-ASCII keywords to English before parsing\n const preprocessedScript = preprocessMultilingual(script);\n const parser = new HybridParser(preprocessedScript);\n ast = parser.parse();\n }\n\n return compileAST(ast, script);\n } catch (error) {\n if (debug) {\n console.warn(`[hyperfixi] Failed to compile: ${script}`, error);\n }\n return null;\n }\n}\n\n/**\n * Extract the primary command name from the AST body.\n * Used for generating semantic handler IDs.\n */\nfunction extractPrimaryCommand(body: ASTNode[]): string {\n if (body.length === 0) return 'handler';\n\n const first = body[0];\n if (first.type === 'command') {\n return (first as CommandNode).name || 'cmd';\n }\n return first.type || 'handler';\n}\n\n/**\n * Compile an AST node to a handler\n */\nfunction compileAST(ast: ASTNode, original: string): CompiledHandler | null {\n if (ast.type !== 'event') {\n // Non-event scripts (like behaviors) need full runtime\n return null;\n }\n\n const eventNode = ast as EventNode;\n const event = eventNode.event;\n const modifiers = eventNode.modifiers || {};\n const body = eventNode.body || [];\n\n const { code, needsEvaluator, needsLocals, needsGlobals } = compileBody(body);\n\n if (code === null || code === '') {\n // Body couldn't be compiled or is empty\n return null;\n }\n\n // Generate semantic ID: {event}_{command}_{hash}\n const command = extractPrimaryCommand(body);\n const id = generateHandlerId(event, command, original);\n\n return {\n id,\n event,\n modifiers: {\n prevent: modifiers.prevent,\n stop: modifiers.stop,\n once: modifiers.once,\n debounce: modifiers.debounce,\n throttle: modifiers.throttle,\n },\n code,\n needsEvaluator: needsEvaluator || needsLocals || needsGlobals,\n original,\n };\n}\n\ninterface BodyCompilation {\n code: string | null;\n needsEvaluator: boolean;\n needsLocals: boolean;\n needsGlobals: boolean;\n}\n\n/**\n * Compile a command sequence to JavaScript\n */\nfunction compileBody(nodes: ASTNode[]): BodyCompilation {\n const statements: string[] = [];\n let needsEvaluator = false;\n let needsLocals = false;\n let needsGlobals = false;\n\n for (const node of nodes) {\n const result = compileNode(node);\n if (result === null) {\n return { code: null, needsEvaluator: false, needsLocals: false, needsGlobals: false };\n }\n\n statements.push(result.code);\n needsEvaluator = needsEvaluator || result.needsEvaluator;\n needsLocals = needsLocals || result.needsLocals;\n needsGlobals = needsGlobals || result.needsGlobals;\n }\n\n return {\n code: statements.join('\\n'),\n needsEvaluator,\n needsLocals,\n needsGlobals,\n };\n}\n\ninterface NodeCompilation {\n code: string;\n needsEvaluator: boolean;\n needsLocals: boolean;\n needsGlobals: boolean;\n}\n\n/**\n * Compile a single AST node to JavaScript\n */\nfunction compileNode(node: ASTNode): NodeCompilation | null {\n if (node.type === 'command') {\n return compileCommand(node as CommandNode);\n }\n\n // Blocks (if, repeat, for, while, fetch) need runtime for now\n // Could be expanded later for simple cases\n return null;\n}\n\n/**\n * Compile a command to JavaScript\n */\nfunction compileCommand(cmd: CommandNode): NodeCompilation | null {\n const target = cmd.target ? compileTarget(cmd.target) : 'm';\n\n switch (cmd.name) {\n case 'toggle':\n return compileToggle(cmd.args, target);\n\n case 'add':\n return compileAdd(cmd.args, target);\n\n case 'remove':\n return compileRemove(cmd.args, target);\n\n case 'removeClass':\n return compileRemoveClass(cmd.args, target);\n\n case 'show':\n return {\n code: `${target}.style.display = ''`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n\n case 'hide':\n return {\n code: `${target}.style.display = 'none'`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n\n case 'focus':\n return {\n code: `${target}.focus()`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n\n case 'blur':\n return {\n code: `${target}.blur()`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n\n case 'log':\n return compileLog(cmd.args);\n\n case 'set':\n return compileSet(cmd.args);\n\n case 'increment':\n return compileIncrement(cmd.args);\n\n case 'decrement':\n return compileDecrement(cmd.args);\n\n case 'put':\n return compilePut(cmd.args, target, cmd.modifier);\n\n case 'send':\n case 'trigger':\n return compileTrigger(cmd.args, target);\n\n case 'wait':\n return compileWait(cmd.args);\n\n default:\n // Unknown command - can't compile\n return null;\n }\n}\n\n// =============================================================================\n// COMMAND COMPILERS\n// =============================================================================\n\nfunction compileToggle(args: ASTNode[], target: string): NodeCompilation | null {\n const className = extractClassName(args[0]);\n if (!className) return null;\n\n if (target === 'm') {\n return {\n code: `m.classList.toggle('${className}')`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n return {\n code: `${target}.forEach(el => el.classList.toggle('${className}'))`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n}\n\nfunction compileAdd(args: ASTNode[], target: string): NodeCompilation | null {\n const className = extractClassName(args[0]);\n if (!className) return null;\n\n if (target === 'm') {\n return {\n code: `m.classList.add('${className}')`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n return {\n code: `${target}.forEach(el => el.classList.add('${className}'))`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n}\n\nfunction compileRemove(args: ASTNode[], target: string): NodeCompilation | null {\n // If no args, remove the element itself\n if (!args || args.length === 0) {\n return {\n code: `${target}.remove()`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n // Otherwise remove a class\n const className = extractClassName(args[0]);\n if (!className) return null;\n\n if (target === 'm') {\n return {\n code: `m.classList.remove('${className}')`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n return {\n code: `${target}.forEach(el => el.classList.remove('${className}'))`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n}\n\nfunction compileRemoveClass(args: ASTNode[], target: string): NodeCompilation | null {\n const className = extractClassName(args[0]);\n if (!className) return null;\n\n if (target === 'm') {\n return {\n code: `m.classList.remove('${className}')`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n return {\n code: `${target}.forEach(el => el.classList.remove('${className}'))`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n}\n\nfunction compileLog(args: ASTNode[]): NodeCompilation | null {\n const compiled = args.map(compileExpression).filter(Boolean);\n if (compiled.length !== args.length) {\n // Some args couldn't be compiled\n return {\n code: `console.log(${compiled.join(', ')})`,\n needsEvaluator: true,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n return {\n code: `console.log(${compiled.join(', ')})`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n}\n\nfunction compileSet(args: ASTNode[]): NodeCompilation | null {\n if (args.length < 2) return null;\n\n const [target, value] = args;\n const compiledValue = compileExpression(value);\n if (!compiledValue) return null;\n\n // Local variable (:varName)\n if (target.type === 'variable') {\n const varNode = target as VariableNode;\n if (varNode.scope === 'local') {\n const varName = varNode.name.slice(1);\n return {\n code: `L.${varName} = ${compiledValue}`,\n needsEvaluator: false,\n needsLocals: true,\n needsGlobals: false,\n };\n }\n // Global variable ($varName)\n if (varNode.scope === 'global') {\n const varName = varNode.name.slice(1);\n return {\n code: `G.${varName} = ${compiledValue}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: true,\n };\n }\n }\n\n // Property assignment (element's property)\n if (target.type === 'possessive') {\n const possNode = target as PossessiveNode;\n const obj = compileExpression(possNode.object);\n const prop = possNode.property;\n if (!obj) return null;\n\n // Style property (*opacity, *color, etc.)\n if (prop.startsWith('*')) {\n const styleProp = prop.slice(1);\n return {\n code: `${obj}.style.${styleProp} = ${compiledValue}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n return {\n code: `${obj}.${prop} = ${compiledValue}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n if (target.type === 'member') {\n const memNode = target as MemberNode;\n const obj = compileExpression(memNode.object);\n const prop = typeof memNode.property === 'string' ? memNode.property : null;\n if (!obj || !prop) return null;\n\n // Style property (*opacity, *color, etc.)\n if (prop.startsWith('*')) {\n const styleProp = prop.slice(1);\n return {\n code: `${obj}.style.${styleProp} = ${compiledValue}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n return {\n code: `${obj}.${prop} = ${compiledValue}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n return null;\n}\n\nfunction compileIncrement(args: ASTNode[]): NodeCompilation | null {\n if (args.length < 1) return null;\n\n const target = args[0];\n const amount = args.length > 1 ? compileExpression(args[1]) : '1';\n\n if (target.type === 'variable') {\n const varNode = target as VariableNode;\n if (varNode.scope === 'local') {\n const varName = varNode.name.slice(1);\n return {\n code: `L.${varName} = (L.${varName} || 0) + ${amount}`,\n needsEvaluator: false,\n needsLocals: true,\n needsGlobals: false,\n };\n }\n if (varNode.scope === 'global') {\n const varName = varNode.name.slice(1);\n return {\n code: `G.${varName} = (G.${varName} || 0) + ${amount}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: true,\n };\n }\n }\n\n // Element textContent\n const compiled = compileExpression(target);\n if (compiled) {\n return {\n code: `${compiled}.textContent = (parseFloat(${compiled}.textContent) || 0) + ${amount}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n return null;\n}\n\nfunction compileDecrement(args: ASTNode[]): NodeCompilation | null {\n if (args.length < 1) return null;\n\n const target = args[0];\n const amount = args.length > 1 ? compileExpression(args[1]) : '1';\n\n if (target.type === 'variable') {\n const varNode = target as VariableNode;\n if (varNode.scope === 'local') {\n const varName = varNode.name.slice(1);\n return {\n code: `L.${varName} = (L.${varName} || 0) - ${amount}`,\n needsEvaluator: false,\n needsLocals: true,\n needsGlobals: false,\n };\n }\n if (varNode.scope === 'global') {\n const varName = varNode.name.slice(1);\n return {\n code: `G.${varName} = (G.${varName} || 0) - ${amount}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: true,\n };\n }\n }\n\n // Element textContent\n const compiled = compileExpression(target);\n if (compiled) {\n return {\n code: `${compiled}.textContent = (parseFloat(${compiled}.textContent) || 0) - ${amount}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n\n return null;\n}\n\nfunction compilePut(args: ASTNode[], target: string, modifier?: string): NodeCompilation | null {\n if (args.length < 1) return null;\n\n const content = compileExpression(args[0]);\n if (!content) return null;\n\n const mod = modifier || 'into';\n\n switch (mod) {\n case 'into':\n return {\n code: `${target}.innerHTML = ${content}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n case 'before':\n return {\n code: `${target}.insertAdjacentHTML('beforebegin', ${content})`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n case 'after':\n return {\n code: `${target}.insertAdjacentHTML('afterend', ${content})`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n case 'at start of':\n return {\n code: `${target}.insertAdjacentHTML('afterbegin', ${content})`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n case 'at end of':\n return {\n code: `${target}.insertAdjacentHTML('beforeend', ${content})`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n default:\n return {\n code: `${target}.innerHTML = ${content}`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n }\n}\n\nfunction compileTrigger(args: ASTNode[], target: string): NodeCompilation | null {\n if (args.length < 1) return null;\n\n const eventName = compileExpression(args[0]);\n if (!eventName) return null;\n\n return {\n code: `${target}.dispatchEvent(new CustomEvent(${eventName}, { bubbles: true }))`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n}\n\nfunction compileWait(args: ASTNode[]): NodeCompilation | null {\n if (args.length < 1) return null;\n\n const duration = compileExpression(args[0]);\n if (!duration) return null;\n\n return {\n code: `await new Promise(r => setTimeout(r, ${duration}))`,\n needsEvaluator: false,\n needsLocals: false,\n needsGlobals: false,\n };\n}\n\n// =============================================================================\n// EXPRESSION COMPILER\n// =============================================================================\n\nfunction compileExpression(node: ASTNode): string | null {\n if (!node) return null;\n\n switch (node.type) {\n case 'literal': {\n const litNode = node as LiteralNode;\n return JSON.stringify(litNode.value);\n }\n\n case 'identifier': {\n const idNode = node as IdentifierNode;\n const val = idNode.value;\n if (val === 'me' || val === 'my') return 'm';\n if (val === 'you') return 'y';\n if (val === 'it') return 'it';\n if (val === 'event') return 'e';\n if (val === 'body') return 'document.body';\n if (val === 'document') return 'document';\n if (val === 'window') return 'window';\n return val;\n }\n\n case 'variable': {\n const varNode = node as VariableNode;\n const name = varNode.name.slice(1);\n return varNode.scope === 'local' ? `L.${name}` : `G.${name}`;\n }\n\n case 'selector': {\n const selNode = node as SelectorNode;\n const sanitized = sanitizeSelector(selNode.value);\n return `document.querySelector('${sanitized}')`;\n }\n\n case 'possessive': {\n const possNode = node as PossessiveNode;\n const obj = compileExpression(possNode.object);\n const prop = possNode.property;\n if (!obj) return null;\n\n // Style property\n if (prop.startsWith('*')) {\n return `${obj}.style.${prop.slice(1)}`;\n }\n // Form values pseudo-property\n if (prop === 'values') {\n return `(function(el){if(el instanceof HTMLFormElement)return new FormData(el);var fd=new FormData();el.querySelectorAll('input,select,textarea').forEach(function(i){var n=i.getAttribute('name');if(n&&'value'in i)fd.append(n,i.value)});return fd})(${obj})`;\n }\n return `${obj}.${prop}`;\n }\n\n case 'member': {\n const memNode = node as MemberNode;\n const obj = compileExpression(memNode.object);\n const prop = typeof memNode.property === 'string' ? memNode.property : null;\n if (!obj || !prop) return null;\n\n // Style property\n if (prop.startsWith('*')) {\n return `${obj}.style.${prop.slice(1)}`;\n }\n return `${obj}.${prop}`;\n }\n\n case 'binary': {\n const binNode = node as BinaryNode;\n const left = compileExpression(binNode.left);\n const right = compileExpression(binNode.right);\n if (!left || !right) return null;\n\n const op = binNode.operator;\n switch (op) {\n case '+':\n case '-':\n case '*':\n case '/':\n case '%':\n return `(${left} ${op} ${right})`;\n case '==':\n case 'is':\n return `(${left} == ${right})`;\n case '!=':\n case 'is not':\n return `(${left} != ${right})`;\n case '<':\n case '>':\n case '<=':\n case '>=':\n return `(${left} ${op} ${right})`;\n case 'and':\n case '&&':\n return `(${left} && ${right})`;\n case 'or':\n case '||':\n return `(${left} || ${right})`;\n case 'has': {\n // Special case: element has .class\n const rightSel = binNode.right as SelectorNode;\n const className = rightSel.value?.slice(1) || '';\n const sanitizedClass = sanitizeClassName(className);\n if (!sanitizedClass) return null; // Invalid class name - fall back to runtime\n return `${left}.classList.contains('${sanitizedClass}')`;\n }\n default:\n return null;\n }\n }\n\n case 'call': {\n const callNode = node as CallNode;\n const callee = callNode.callee;\n const args = (callNode.args || []).map(compileExpression);\n if (args.some((a: string | null) => a === null)) return null;\n\n if (callee.type === 'member' || callee.type === 'possessive') {\n const memCallee = callee as MemberNode | PossessiveNode;\n const obj = compileExpression(memCallee.object);\n const prop = typeof memCallee.property === 'string' ? memCallee.property : null;\n if (!obj || !prop) return null;\n return `${obj}.${prop}(${args.join(', ')})`;\n }\n\n const fn = compileExpression(callee);\n if (!fn) return null;\n return `${fn}(${args.join(', ')})`;\n }\n\n case 'positional': {\n const posNode = node as PositionalNode;\n const position = posNode.position;\n const target = posNode.target;\n\n switch (position) {\n case 'first':\n if (target?.type === 'selector') {\n const selNode = target as SelectorNode;\n const sanitized = sanitizeSelector(selNode.value);\n return `document.querySelector('${sanitized}')`;\n }\n return null; // Arrays need runtime\n\n case 'last':\n if (target?.type === 'selector') {\n const selNode = target as SelectorNode;\n const sanitized = sanitizeSelector(selNode.value);\n return `(()=>{const e=document.querySelectorAll('${sanitized}');return e[e.length-1]})()`;\n }\n return null; // Arrays need runtime\n\n case 'next':\n return 'm.nextElementSibling';\n\n case 'previous':\n return 'm.previousElementSibling';\n\n case 'closest':\n if (target?.type === 'selector') {\n const selNode = target as SelectorNode;\n const sanitized = sanitizeSelector(selNode.value);\n return `m.closest('${sanitized}')`;\n }\n return null;\n\n case 'parent':\n return 'm.parentElement';\n\n default:\n return null;\n }\n }\n\n default:\n return null;\n }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction compileTarget(target: ASTNode): string {\n if (target.type === 'identifier') {\n const idNode = target as IdentifierNode;\n if (idNode.value === 'me' || idNode.value === 'my') return 'm';\n if (idNode.value === 'you') return 'y';\n }\n\n if (target.type === 'selector') {\n const selNode = target as SelectorNode;\n const sanitized = sanitizeSelector(selNode.value);\n return `document.querySelectorAll('${sanitized}')`;\n }\n\n const compiled = compileExpression(target);\n return compiled || 'm';\n}\n\nfunction extractClassName(node: ASTNode): string | null {\n if (!node) return null;\n\n if (node.type === 'selector') {\n const selNode = node as SelectorNode;\n const val = selNode.value;\n const rawClass = val.startsWith('.') ? val.slice(1) : val;\n // Sanitize class name before returning\n return sanitizeClassName(rawClass);\n }\n\n if (node.type === 'literal' || node.type === 'string') {\n const litNode = node as LiteralNode;\n const val = litNode.value;\n if (typeof val === 'string') {\n const rawClass = val.startsWith('.') ? val.slice(1) : val;\n return sanitizeClassName(rawClass);\n }\n }\n\n if (node.type === 'identifier') {\n const idNode = node as IdentifierNode;\n return sanitizeClassName(idNode.value);\n }\n\n return null;\n}\n","/**\n * Compiled Generator\n *\n * Generates minimal runtime code from compiled handlers.\n * No parser needed - all hyperscript is pre-compiled to JS.\n *\n * Target: ~500 bytes gzipped for simple handlers\n */\n\nimport type { CompiledHandler } from './compiler';\n\nexport interface CompiledBundleOptions {\n /** Compiled handlers */\n handlers: CompiledHandler[];\n\n /** Whether any handler needs locals */\n needsLocals: boolean;\n\n /** Whether any handler needs globals */\n needsGlobals: boolean;\n\n /** Global variable name */\n globalName?: string;\n\n /** Enable htmx integration */\n htmx?: boolean;\n\n /** Include source maps / debug info */\n debug?: boolean;\n}\n\n/**\n * Generate a source map table showing original hyperscript → compiled handler ID.\n * Included in bundle header when debug mode is enabled.\n */\nfunction generateSourceMapTable(handlers: CompiledHandler[]): string {\n if (handlers.length === 0) return '';\n\n const lines = [\n ' *',\n ' * Handler Source Map:',\n ' * ┌─────────────────────────────────────────────────────────────────┐',\n ];\n\n for (const h of handlers) {\n const original = h.original.replace(/\\n/g, ' ').slice(0, 40);\n const truncated = original.length < h.original.length ? original + '...' : original;\n lines.push(` * │ ${h.id.padEnd(20)} ← ${truncated.padEnd(40)} │`);\n }\n\n lines.push(' * └─────────────────────────────────────────────────────────────────┘');\n lines.push(' *');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate minimal runtime bundle from compiled handlers\n */\nexport function generateCompiledBundle(options: CompiledBundleOptions): string {\n const {\n handlers,\n needsLocals,\n needsGlobals,\n globalName = 'hyperfixi',\n htmx = false,\n debug = false,\n } = options;\n\n // Generate handler map with optional debug comments\n const handlerEntries = handlers.map(h => {\n const isAsync = h.code.includes('await');\n const fn = isAsync ? `async(m,e,y)=>{${h.code}}` : `(m,e,y)=>{${h.code}}`;\n\n if (debug) {\n // Include original hyperscript as comment for debugging\n const escapedOriginal = h.original.replace(/\\*/g, '\\\\*').replace(/\\n/g, ' ');\n return `\\n /* ${escapedOriginal} */\\n ${h.id}:${fn}`;\n }\n return `${h.id}:${fn}`;\n });\n\n // Generate event registration for each handler\n const registrations = handlers.map(h => {\n const modsCode = generateModifiersCode(h);\n return ` case '${h.id}': r(el,'${h.event}',H.${h.id}${modsCode}); break;`;\n });\n\n const localsCode = needsLocals ? 'const L={};' : '';\n const globalsCode = needsGlobals ? 'const G={};' : '';\n\n // Generate source map table for debug mode\n const sourceMapTable = debug ? generateSourceMapTable(handlers) : '';\n\n return `/**\n * HyperFixi Compiled Bundle (Auto-Generated)\n *\n * Pre-compiled hyperscript - no runtime parser needed!\n * Handlers: ${handlers.length}\n *\n * DO NOT EDIT - Regenerate with build.\n${sourceMapTable} */\n\n${localsCode}${globalsCode}\nconst H={${handlerEntries.join(',')}};\n\nfunction r(el,ev,fn${hasModifiers(handlers) ? ',m' : ''}){\n let h=e=>fn(el,e,e.target);\n${generateModifierWrappers(handlers)}\n el.addEventListener(ev,h${hasOnce(handlers) ? ',{once:m?.o}' : ''});\n}\n\nfunction init(root=document){\n root.querySelectorAll('[data-h]').forEach(el=>{\n switch(el.dataset.h){\n${registrations.join('\\n')}\n }\n });\n}\n\n${htmx ? `document.addEventListener('htmx:afterSettle',e=>init(e.detail?.target));` : ''}\n\nconst api={\n version:'1.0.0-compiled',\n commands:${JSON.stringify(handlers.map(h => h.id))},\n init,\n process:init,\n};\n\nif(typeof window!=='undefined'){\n window.${globalName}=api;\n document.readyState==='loading'\n ?document.addEventListener('DOMContentLoaded',()=>init())\n :init();\n}\n\nexport default api;\nexport{api,init};\n`;\n}\n\n/**\n * Generate modifiers code for a handler registration\n */\nfunction generateModifiersCode(h: CompiledHandler): string {\n const mods: string[] = [];\n\n if (h.modifiers.prevent) mods.push('p:1');\n if (h.modifiers.stop) mods.push('s:1');\n if (h.modifiers.once) mods.push('o:1');\n if (h.modifiers.debounce) mods.push(`d:${h.modifiers.debounce}`);\n if (h.modifiers.throttle) mods.push(`t:${h.modifiers.throttle}`);\n\n if (mods.length === 0) return '';\n return `,{${mods.join(',')}}`;\n}\n\n/**\n * Check if any handler has modifiers\n */\nfunction hasModifiers(handlers: CompiledHandler[]): boolean {\n return handlers.some(\n h =>\n h.modifiers.prevent ||\n h.modifiers.stop ||\n h.modifiers.once ||\n h.modifiers.debounce ||\n h.modifiers.throttle\n );\n}\n\n/**\n * Check if any handler has .once modifier\n */\nfunction hasOnce(handlers: CompiledHandler[]): boolean {\n return handlers.some(h => h.modifiers.once);\n}\n\n/**\n * Generate modifier wrapper code\n */\nfunction generateModifierWrappers(handlers: CompiledHandler[]): string {\n const lines: string[] = [];\n\n if (handlers.some(h => h.modifiers.prevent || h.modifiers.stop)) {\n lines.push(\n ` if(m?.p||m?.s){const _h=h;h=e=>{m.p&&e.preventDefault();m.s&&e.stopPropagation();_h(e.currentTarget,e,e.target)};}`\n );\n }\n\n if (handlers.some(h => h.modifiers.debounce)) {\n lines.push(\n ` if(m?.d){let t;const _h=h;h=e=>{clearTimeout(t);t=setTimeout(()=>_h(e.currentTarget,e,e.target),m.d)};}`\n );\n }\n\n if (handlers.some(h => h.modifiers.throttle)) {\n lines.push(\n ` if(m?.t){let l=0;const _h=h;h=e=>{const n=Date.now();if(n-l>=m.t){l=n;_h(e.currentTarget,e,e.target)}};}`\n );\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate the HTML transformer output\n *\n * Transforms: <button _=\"on click toggle .active\">\n * To: <button data-h=\"click_toggle_3a2b\">\n */\nexport function generateTransformMap(handlers: CompiledHandler[]): Map<string, string> {\n const map = new Map<string, string>();\n\n for (const h of handlers) {\n map.set(h.original, h.id);\n }\n\n return map;\n}\n\n/**\n * Handler manifest entry for debugging\n */\nexport interface HandlerManifestEntry {\n /** Semantic handler ID (e.g., click_toggle_3a2b) */\n id: string;\n /** Event that triggers this handler */\n event: string;\n /** Primary command */\n command: string;\n /** Original hyperscript source */\n original: string;\n /** Compiled JavaScript code */\n compiled: string;\n /** Event modifiers */\n modifiers: {\n prevent?: boolean;\n stop?: boolean;\n once?: boolean;\n debounce?: number;\n throttle?: number;\n };\n}\n\n/**\n * Generate a JSON manifest for debugging.\n * Can be written to a separate file or used in devtools.\n *\n * @example\n * // In vite plugin:\n * const manifest = generateManifest(handlers);\n * fs.writeFileSync('hyperfixi-manifest.json', JSON.stringify(manifest, null, 2));\n */\nexport function generateManifest(handlers: CompiledHandler[]): HandlerManifestEntry[] {\n return handlers.map(h => {\n // Extract command from semantic ID (click_toggle_3a2b → toggle)\n const parts = h.id.split('_');\n const command = parts.length >= 2 ? parts[1] : 'unknown';\n\n return {\n id: h.id,\n event: h.event,\n command,\n original: h.original,\n compiled: h.code,\n modifiers: h.modifiers,\n };\n });\n}\n\n/**\n * Generate a human-readable debug report.\n * Useful for console output or log files.\n */\nexport function generateDebugReport(handlers: CompiledHandler[]): string {\n const lines = [\n '╔══════════════════════════════════════════════════════════════════╗',\n '║ HyperFixi Compiled Handlers Debug Report ║',\n '╠══════════════════════════════════════════════════════════════════╣',\n '',\n ];\n\n for (const h of handlers) {\n lines.push(`┌── ${h.id} ──────────────────────────────────────────────`);\n lines.push(`│ Event: ${h.event}`);\n lines.push(`│ Original: ${h.original}`);\n lines.push(`│ Compiled: ${h.code}`);\n if (Object.values(h.modifiers).some(Boolean)) {\n const mods = Object.entries(h.modifiers)\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}=${v}`)\n .join(', ');\n lines.push(`│ Modifiers: ${mods}`);\n }\n lines.push('└─────────────────────────────────────────────────────────────');\n lines.push('');\n }\n\n lines.push('╚══════════════════════════════════════════════════════════════════╝');\n\n return lines.join('\\n');\n}\n","/**\n * HTML Transformer\n *\n * Transforms HTML files to replace _=\"...\" attributes with data-h=\"...\" attributes\n * for compile mode.\n */\n\nimport type { CompiledHandler } from './compiler';\n\nexport interface TransformResult {\n /** Transformed HTML code */\n code: string;\n\n /** Whether the HTML was modified */\n modified: boolean;\n\n /** Scripts that were found but couldn't be compiled */\n fallbacks: string[];\n}\n\n/**\n * Transform HTML to use compiled handler IDs\n */\nexport function transformHTML(\n html: string,\n handlerMap: Map<string, string>,\n fallbackScripts: Set<string>\n): TransformResult {\n let modified = false;\n const fallbacks: string[] = [];\n\n // Regex patterns for _=\"...\" attributes\n const patterns = [\n /(\\s)_\\s*=\\s*\"([^\"]+)\"/g, // _=\"...\"\n /(\\s)_\\s*=\\s*'([^']+)'/g, // _='...'\n /(\\s)_\\s*=\\s*`([^`]+)`/g, // _=`...`\n ];\n\n let result = html;\n\n for (const pattern of patterns) {\n result = result.replace(pattern, (match, whitespace, script) => {\n const handlerId = handlerMap.get(script);\n\n if (handlerId) {\n modified = true;\n return `${whitespace}data-h=\"${handlerId}\"`;\n }\n\n // Script couldn't be compiled - check if it's a known fallback\n if (fallbackScripts.has(script)) {\n fallbacks.push(script);\n // Keep original for fallback runtime\n return match;\n }\n\n // Unknown script - keep original but warn\n fallbacks.push(script);\n return match;\n });\n }\n\n return {\n code: result,\n modified,\n fallbacks,\n };\n}\n\n/**\n * Build a handler map from compiled handlers\n */\nexport function buildHandlerMap(handlers: CompiledHandler[]): Map<string, string> {\n const map = new Map<string, string>();\n\n for (const handler of handlers) {\n map.set(handler.original, handler.id);\n }\n\n return map;\n}\n\n/**\n * Extract all hyperscript snippets from HTML\n */\nexport function extractScripts(html: string): string[] {\n const scripts: string[] = [];\n\n const patterns = [/_\\s*=\\s*\"([^\"]+)\"/g, /_\\s*=\\s*'([^']+)'/g, /_\\s*=\\s*`([^`]+)`/g];\n\n for (const pattern of patterns) {\n let match;\n while ((match = pattern.exec(html))) {\n scripts.push(match[1]);\n }\n }\n\n return scripts;\n}\n","import { resolve, join } from 'node:path';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport type { ServerBridgeOptions } from './types.js';\n\n/** Dynamically-loaded server-bridge module shape */\ninterface ServerBridgeModule {\n generate: (options: {\n dir: string;\n framework?: string;\n output?: string;\n typescript?: boolean;\n ignore?: string[];\n }) => Promise<{\n scan: { routes: Array<{ method: string; path: string }>; conflicts: unknown[] };\n generated: { files: Array<{ path: string; content: string }> };\n routes: Array<{ method: string; path: string }>;\n }>;\n createManifest: (routes: unknown[]) => unknown;\n saveManifest: (dir: string, manifest: unknown) => Promise<void>;\n}\n\nlet serverBridge: ServerBridgeModule | null = null;\nlet loadAttempted = false;\nlet lastRouteHash = '';\n\n/**\n * Attempt to lazy-load @hyperfixi/server-bridge.\n * Returns null with a warning if not installed.\n */\nexport async function loadServerBridge(debug?: boolean): Promise<ServerBridgeModule | null> {\n if (loadAttempted) return serverBridge;\n loadAttempted = true;\n\n try {\n const mod = await import('@hyperfixi/server-bridge');\n serverBridge = mod as unknown as ServerBridgeModule;\n if (debug) {\n console.log('[hyperfixi] Server-bridge loaded successfully');\n }\n return serverBridge;\n } catch {\n console.warn(\n '[hyperfixi] @hyperfixi/server-bridge is not installed. ' +\n 'Install it to enable server route generation: npm install @hyperfixi/server-bridge'\n );\n return null;\n }\n}\n\n/**\n * Compute a hash of routes for change detection.\n */\nfunction computeRouteHash(routes: Array<{ method: string; path: string }>): string {\n return routes\n .map(r => `${r.method}:${r.path}`)\n .sort()\n .join('|');\n}\n\n/**\n * Run a full server-bridge scan + generate cycle.\n * Skips generation if routes haven't changed (hash-based).\n */\nexport async function runServerBridge(\n cwd: string,\n options: ServerBridgeOptions,\n debug?: boolean,\n force?: boolean\n): Promise<void> {\n const mod = serverBridge ?? (await loadServerBridge(debug));\n if (!mod) return;\n\n try {\n const outputDir = resolve(cwd, options.output ?? './server/routes');\n\n const result = await mod.generate({\n dir: cwd,\n framework: options.framework ?? 'express',\n output: options.output,\n typescript: options.typescript,\n ignore: options.ignore,\n });\n\n // Skip writing if routes haven't changed\n const routeHash = computeRouteHash(result.routes);\n if (!force && routeHash === lastRouteHash) {\n if (debug) {\n console.log('[hyperfixi] Server-bridge: routes unchanged, skipping generation');\n }\n return;\n }\n lastRouteHash = routeHash;\n\n if (result.routes.length === 0) {\n if (debug) {\n console.log('[hyperfixi] Server-bridge: no routes found');\n }\n return;\n }\n\n // Write generated files\n await mkdir(outputDir, { recursive: true });\n for (const file of result.generated.files) {\n const filePath = join(outputDir, file.path);\n const fileDir = join(filePath, '..');\n await mkdir(fileDir, { recursive: true });\n await writeFile(filePath, file.content, 'utf-8');\n }\n\n // Save manifest\n const manifest = mod.createManifest(result.routes);\n await mod.saveManifest(outputDir, manifest);\n\n if (debug) {\n console.log(\n `[hyperfixi] Server-bridge: generated ${result.generated.files.length} file(s) ` +\n `for ${result.routes.length} route(s) in ${outputDir}/`\n );\n }\n\n if (result.scan.conflicts.length > 0) {\n console.warn(\n `[hyperfixi] Server-bridge: ${result.scan.conflicts.length} route conflict(s) detected`\n );\n }\n } catch (err) {\n console.error(\n '[hyperfixi] Server-bridge generation failed:',\n err instanceof Error ? err.message : err\n );\n }\n}\n\n/**\n * Reset cached state (for testing).\n */\nexport function resetServerBridgeState(): void {\n serverBridge = null;\n loadAttempted = false;\n lastRouteHash = '';\n}\n\n// Export for testing\nexport { computeRouteHash as _computeRouteHash };\n","/**\n * Domain Scanner for Vite Plugin\n *\n * Scans source files for domain-specific DSL usage based on configurable\n * attribute patterns and keyword sets. Runs alongside the existing\n * hyperscript Scanner as an opt-in feature.\n */\n\nimport type { DomainScanRule, DomainFileUsage } from './types';\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Build regex patterns for extracting attribute values.\n */\nfunction buildAttributePatterns(attributes: readonly string[]): RegExp[] {\n const patterns: RegExp[] = [];\n for (const attr of attributes) {\n const escaped = attr.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n patterns.push(new RegExp(`${escaped}\\\\s*=\\\\s*\"([^\"]+)\"`, 'g'));\n patterns.push(new RegExp(`${escaped}\\\\s*=\\\\s*'([^']+)'`, 'g'));\n patterns.push(new RegExp(`${escaped}\\\\s*=\\\\s*\\`([^\\`]+)\\``, 'g'));\n }\n return patterns;\n}\n\n/**\n * Build regex patterns for extracting script tag contents.\n */\nfunction buildScriptPatterns(scriptTypes: readonly string[]): RegExp[] {\n return scriptTypes.map(type => {\n const escaped = type.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`<script[^>]*type=[\"']?${escaped}[\"']?[^>]*>([\\\\s\\\\S]*?)<\\\\/script>`, 'gi');\n });\n}\n\n/**\n * Detect keywords in a snippet.\n */\nfunction detectKeywords(\n snippet: string,\n keywords: Readonly<Record<string, readonly string[]>>\n): { detectedKeywords: Set<string>; detectedLanguages: Set<string> } {\n const detectedKeywords = new Set<string>();\n const detectedLanguages = new Set<string>();\n\n for (const [lang, kwList] of Object.entries(keywords)) {\n for (const kw of kwList) {\n // Use word boundary for Latin characters, simple includes for non-Latin\n const isLatin = /^[a-zA-Z]/.test(kw);\n const found = isLatin\n ? new RegExp(`\\\\b${kw.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i').test(snippet)\n : snippet.includes(kw);\n\n if (found) {\n detectedKeywords.add(kw);\n detectedLanguages.add(lang);\n }\n }\n }\n\n return { detectedKeywords, detectedLanguages };\n}\n\n// =============================================================================\n// DomainScanner\n// =============================================================================\n\n/**\n * Scanner that detects domain-specific syntax in source files.\n * Complements the existing hyperscript Scanner.\n */\nexport class DomainScanner {\n private rules: readonly DomainScanRule[];\n /** Pre-compiled regex for fast hasAnyDomainUsage check */\n private quickCheckPattern: RegExp | null;\n\n constructor(rules: readonly DomainScanRule[]) {\n this.rules = rules;\n\n // Build a quick-check regex from all attribute names\n const allAttrs = rules.flatMap(r => [...r.attributes]);\n const allScriptTypes = rules.flatMap(r => (r.scriptTypes ? [...r.scriptTypes] : []));\n const parts: string[] = [];\n\n for (const attr of allAttrs) {\n parts.push(attr.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n }\n for (const type of allScriptTypes) {\n parts.push(type.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n }\n\n this.quickCheckPattern = parts.length > 0 ? new RegExp(parts.join('|'), 'i') : null;\n }\n\n /**\n * Fast pre-check: does this code contain any domain-related attributes?\n */\n hasAnyDomainUsage(code: string): boolean {\n if (!this.quickCheckPattern) return false;\n return this.quickCheckPattern.test(code);\n }\n\n /**\n * Scan a file for all registered domain syntaxes.\n * Returns one DomainFileUsage per domain that had matches.\n */\n scan(code: string, _id: string): DomainFileUsage[] {\n const results: DomainFileUsage[] = [];\n\n for (const rule of this.rules) {\n const snippets: string[] = [];\n\n // Extract from attributes\n const attrPatterns = buildAttributePatterns(rule.attributes);\n for (const pattern of attrPatterns) {\n pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(code))) {\n const value = match[1].trim();\n if (value) snippets.push(value);\n }\n }\n\n // Extract from script tags\n if (rule.scriptTypes) {\n const scriptPatterns = buildScriptPatterns(rule.scriptTypes);\n for (const pattern of scriptPatterns) {\n pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(code))) {\n const value = match[1].trim();\n if (value) snippets.push(value);\n }\n }\n }\n\n if (snippets.length === 0) continue;\n\n // Detect keywords in extracted snippets\n const allDetectedKeywords = new Set<string>();\n const allDetectedLanguages = new Set<string>();\n\n if (rule.keywords) {\n for (const snippet of snippets) {\n const { detectedKeywords, detectedLanguages } = detectKeywords(snippet, rule.keywords);\n for (const kw of detectedKeywords) allDetectedKeywords.add(kw);\n for (const lang of detectedLanguages) allDetectedLanguages.add(lang);\n }\n }\n\n results.push({\n domain: rule.domain,\n detectedKeywords: allDetectedKeywords,\n detectedLanguages: allDetectedLanguages,\n snippetCount: snippets.length,\n });\n }\n\n return results;\n }\n}\n\n// =============================================================================\n// Helper: Convert DomainDescriptor.scanConfig to DomainScanRule\n// =============================================================================\n\n/**\n * Convert a DomainDescriptor's scanConfig to a DomainScanRule.\n * Returns null if the descriptor has no scanConfig.\n *\n * This allows DomainDescriptors from the framework to be used\n * directly with the Vite plugin scanner.\n */\nexport function descriptorToScanRule(descriptor: {\n name: string;\n scanConfig?: {\n attributes: readonly string[];\n scriptTypes?: readonly string[];\n keywords?: Readonly<Record<string, readonly string[]>>;\n };\n}): DomainScanRule | null {\n if (!descriptor.scanConfig) return null;\n return {\n domain: descriptor.name,\n attributes: [...descriptor.scanConfig.attributes],\n scriptTypes: descriptor.scanConfig.scriptTypes\n ? [...descriptor.scanConfig.scriptTypes]\n : undefined,\n keywords: descriptor.scanConfig.keywords\n ? Object.fromEntries(\n Object.entries(descriptor.scanConfig.keywords).map(([k, v]) => [k, [...v]])\n )\n : undefined,\n };\n}\n","/**\n * Domain Aggregator\n *\n * Aggregates per-domain usage across files, following the same\n * pattern as the existing hyperscript Aggregator.\n */\n\nimport type { DomainFileUsage, DomainAggregatedUsage } from './types';\n\n/**\n * Aggregates domain usage across multiple files.\n */\nexport class DomainAggregator {\n private fileUsage = new Map<string, DomainFileUsage[]>();\n private cache: DomainAggregatedUsage[] | null = null;\n\n /**\n * Add or update domain usage for a file.\n * Returns true if usage changed (invalidates cache).\n */\n add(filePath: string, usage: DomainFileUsage[]): boolean {\n const existing = this.fileUsage.get(filePath);\n const changed = !existing || !this.isEqual(existing, usage);\n\n if (changed) {\n this.fileUsage.set(filePath, usage);\n this.cache = null;\n }\n\n return changed;\n }\n\n /**\n * Remove a file's domain usage.\n * Returns true if the file was tracked.\n */\n remove(filePath: string): boolean {\n const had = this.fileUsage.has(filePath);\n if (had) {\n this.fileUsage.delete(filePath);\n this.cache = null;\n }\n return had;\n }\n\n /**\n * Get aggregated usage across all files.\n * Result is cached until add/remove changes it.\n */\n getUsage(): DomainAggregatedUsage[] {\n if (this.cache) return this.cache;\n\n const domainMap = new Map<\n string,\n {\n detectedKeywords: Set<string>;\n detectedLanguages: Set<string>;\n fileCount: number;\n totalSnippets: number;\n }\n >();\n\n for (const usages of this.fileUsage.values()) {\n for (const usage of usages) {\n let entry = domainMap.get(usage.domain);\n if (!entry) {\n entry = {\n detectedKeywords: new Set(),\n detectedLanguages: new Set(),\n fileCount: 0,\n totalSnippets: 0,\n };\n domainMap.set(usage.domain, entry);\n }\n\n entry.fileCount++;\n entry.totalSnippets += usage.snippetCount;\n for (const kw of usage.detectedKeywords) entry.detectedKeywords.add(kw);\n for (const lang of usage.detectedLanguages) entry.detectedLanguages.add(lang);\n }\n }\n\n this.cache = Array.from(domainMap.entries()).map(([domain, data]) => ({\n domain,\n detectedKeywords: data.detectedKeywords,\n detectedLanguages: data.detectedLanguages,\n fileCount: data.fileCount,\n totalSnippets: data.totalSnippets,\n }));\n\n return this.cache;\n }\n\n /**\n * Get aggregated usage for a specific domain.\n */\n getUsageForDomain(domain: string): DomainAggregatedUsage | null {\n return this.getUsage().find(u => u.domain === domain) ?? null;\n }\n\n /**\n * Clear all tracked data.\n */\n clear(): void {\n this.fileUsage.clear();\n this.cache = null;\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private isEqual(a: DomainFileUsage[], b: DomainFileUsage[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].domain !== b[i].domain) return false;\n if (a[i].snippetCount !== b[i].snippetCount) return false;\n if (a[i].detectedKeywords.size !== b[i].detectedKeywords.size) return false;\n }\n return true;\n }\n}\n","/**\n * @hyperfixi/vite-plugin\n *\n * Zero-config Vite plugin that automatically generates minimal HyperFixi bundles\n * based on detected hyperscript usage in your source files.\n *\n * @example\n * ```javascript\n * // vite.config.js\n * import { hyperfixi } from '@hyperfixi/vite-plugin';\n *\n * export default {\n * plugins: [hyperfixi()]\n * };\n * ```\n *\n * The plugin automatically:\n * - Scans HTML, Vue, Svelte, JSX/TSX files for `_=\"...\"` attributes\n * - Detects which commands, blocks, and expressions are used\n * - Generates a minimal bundle with only needed features\n * - Re-generates on file changes (HMR)\n *\n * @example\n * ```javascript\n * // With options\n * hyperfixi({\n * extraCommands: ['fetch', 'put'], // Always include these commands\n * htmx: true, // Enable htmx integration\n * debug: true, // Enable verbose logging\n * })\n * ```\n *\n * @example\n * ```javascript\n * // Compile mode for smallest bundles (~500 bytes)\n * hyperfixi({\n * mode: 'compile', // Pre-compile hyperscript to JS\n * debug: true,\n * })\n * ```\n */\n\nimport type { Plugin, ResolvedConfig, ViteDevServer, HmrContext } from 'vite';\nimport type { HyperfixiPluginOptions, AggregatedUsage } from './types';\nimport { Scanner } from './scanner';\nimport { Aggregator } from './aggregator';\nimport { Generator } from './generator';\nimport { compile, resetCompiler, setMultilingualAliases, type CompiledHandler } from './compiler';\nimport { generateCompiledBundle } from './compiled-generator';\nimport { transformHTML, extractScripts } from './html-transformer';\nimport { getMultilingualCommandAliases } from './semantic-integration';\nimport type { SupportedLanguage } from './language-keywords';\nimport { loadServerBridge, runServerBridge } from './server-bridge-integration';\nimport { DomainScanner } from './domain-scanner';\nimport { DomainAggregator } from './domain-aggregator';\n\n// Re-export types\nexport type {\n HyperfixiPluginOptions,\n FileUsage,\n AggregatedUsage,\n CustomLanguageKeywords,\n ServerBridgeOptions,\n DomainScanRule,\n DomainFileUsage,\n DomainAggregatedUsage,\n} from './types';\n\n// Domain scanning (multi-domain support)\nexport { DomainScanner, descriptorToScanRule } from './domain-scanner';\nexport { DomainAggregator } from './domain-aggregator';\nexport type { CompiledHandler, CompileOptions } from './compiler';\n\n// Re-export semantic parser integration functions for multilingual compile mode\nexport { setSemanticParser, clearSemanticParser, hasSemanticParser } from './compiler';\n\n// Re-export language keyword utilities for customization\nexport {\n SUPPORTED_LANGUAGES,\n REGIONS,\n registerCustomKeywords,\n getKeywordsForLanguage,\n isNonLatinLanguage,\n getAllLanguageCodes,\n clearCustomKeywords,\n detectLanguages,\n getOptimalRegion,\n} from './language-keywords';\nexport type { SupportedLanguage } from './language-keywords';\n\n// Virtual module ID\nconst VIRTUAL_MODULE_ID = 'virtual:hyperfixi';\nconst RESOLVED_VIRTUAL_MODULE_ID = '\\0' + VIRTUAL_MODULE_ID;\n\n/**\n * Import aliases that resolve to the virtual module.\n *\n * `lokascript` is here for a reason beyond brand symmetry: the docs consistently\n * show `import 'lokascript'` for the plugin flow, and neither `lokascript` nor\n * `hyperfixi` is a published npm package. Because `resolveId` runs BEFORE\n * node_modules resolution, any specifier listed here is intercepted and can\n * never fall through. Any specifier NOT listed here falls through — so an\n * unlisted `lokascript` failed to resolve outright, and would silently resolve\n * to a full ~300 KB package the day someone publishes that name, defeating the\n * entire point of the plugin's generated ~8 KB bundle. Listing it closes both.\n */\nconst IMPORT_ALIASES = ['hyperfixi', 'lokascript', '@hyperfixi/core', 'virtual:hyperfixi'];\n\n/**\n * Compute a hash of the current usage for dev-server cache invalidation.\n *\n * Every input that influences bundle SELECTION must be part of this hash.\n * The htmx/reactivity flags route to the hybrid-hx / hx-v4 tiers; before they\n * were hashed, adding or removing an hx-live/sse-connect/ws-send attribute —\n * without touching any command/block/language — left the cached dev bundle at\n * the wrong tier. Exported for tests.\n */\nexport function computeUsageHash(usage: AggregatedUsage): string {\n const commands = [...usage.commands].sort().join(',');\n const blocks = [...usage.blocks].sort().join(',');\n const languages = [...usage.detectedLanguages].sort().join(',');\n const htmx = usage.htmx\n ? [\n usage.htmx.hasHtmxAttributes,\n usage.htmx.hasFixiAttributes,\n usage.htmx.needsHxLive,\n usage.htmx.needsSSE,\n usage.htmx.needsWS,\n usage.htmx.needsBindToProperty,\n usage.htmx.needsReactivity,\n ]\n .map(f => (f ? '1' : '0'))\n .join('')\n : 'none';\n const reactivity = `${usage.needsReactivity ? 1 : 0}${usage.needsBindToProperty ? 1 : 0}`;\n return `${commands}|${blocks}|${usage.positional}|${languages}|${htmx}|${reactivity}`;\n}\n\n/**\n * Create the HyperFixi Vite plugin\n *\n * @param options Plugin options\n * @returns Vite plugin\n */\nexport function hyperfixi(options: HyperfixiPluginOptions = {}): Plugin {\n const mode = options.mode ?? 'interpret';\n const scanner = new Scanner(options);\n const aggregator = new Aggregator();\n const generator = new Generator(options);\n\n // Domain scanning (multi-domain support)\n const domainScanner =\n options.domains && options.domains.length > 0 ? new DomainScanner(options.domains) : null;\n const domainAggregator = domainScanner ? new DomainAggregator() : null;\n\n let server: ViteDevServer | null = null;\n let cachedBundle: string | null = null;\n let lastUsageHash = '';\n let isDev = false;\n\n // Compile mode state\n const compiledHandlers: CompiledHandler[] = [];\n const handlerMap = new Map<string, string>(); // script -> handlerId\n const fallbackScripts = new Set<string>(); // Scripts that couldn't be compiled\n let needsLocals = false;\n let needsGlobals = false;\n\n /**\n * Invalidate the virtual module in dev server\n */\n function invalidateVirtualModule(): void {\n if (!server) return;\n\n const mod = server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);\n if (mod) {\n server.moduleGraph.invalidateModule(mod);\n server.ws.send({ type: 'full-reload' });\n\n if (options.debug) {\n console.log('[hyperfixi] Virtual module invalidated, triggering reload');\n }\n }\n }\n\n /**\n * Compile a hyperscript snippet and add to handlers\n */\n function compileScript(script: string): string | null {\n // Check if already compiled\n if (handlerMap.has(script)) {\n return handlerMap.get(script)!;\n }\n\n // Check if known fallback\n if (fallbackScripts.has(script)) {\n return null;\n }\n\n // Try to compile\n const handler = compile(script);\n\n if (handler) {\n compiledHandlers.push(handler);\n handlerMap.set(script, handler.id);\n\n if (handler.needsEvaluator) {\n // Check if needs locals/globals based on code\n if (handler.code.includes('L.')) needsLocals = true;\n if (handler.code.includes('G.')) needsGlobals = true;\n }\n\n if (options.debug) {\n console.log(`[hyperfixi] Compiled: \"${script}\" -> ${handler.id}`);\n }\n\n return handler.id;\n }\n\n // Couldn't compile - mark as fallback\n fallbackScripts.add(script);\n\n if (options.debug) {\n console.log(`[hyperfixi] Fallback (not compilable): \"${script}\"`);\n }\n\n return null;\n }\n\n /**\n * Generate the bundle code (interpret mode)\n */\n function generateInterpretBundle(): string {\n const usage = aggregator.getUsage();\n const usageHash = computeUsageHash(usage);\n\n // Return cached bundle if usage hasn't changed\n if (cachedBundle && usageHash === lastUsageHash) {\n return cachedBundle;\n }\n\n // In dev mode, optionally use fallback bundle for faster rebuilds\n if (isDev && options.devFallback && options.devFallback !== 'auto') {\n cachedBundle = generator.generateDevFallback(options.devFallback);\n } else {\n cachedBundle = generator.generate(usage, options);\n }\n\n lastUsageHash = usageHash;\n\n if (options.debug) {\n const summary = aggregator.getSummary();\n console.log('[hyperfixi] Bundle generated:', summary);\n }\n\n return cachedBundle;\n }\n\n /**\n * Generate the bundle code (compile mode)\n */\n function generateCompiledBundleCode(): string {\n // Check if we have fallbacks that need the interpreter\n if (fallbackScripts.size > 0) {\n if (options.debug) {\n console.log(`[hyperfixi] ${fallbackScripts.size} scripts need interpreter fallback`);\n }\n // Fall back to interpret mode for this build\n return generateInterpretBundle();\n }\n\n const bundle = generateCompiledBundle({\n handlers: compiledHandlers,\n needsLocals,\n needsGlobals,\n globalName: options.globalName,\n htmx: options.htmx,\n debug: options.debug,\n });\n\n if (options.debug) {\n console.log(`[hyperfixi] Compiled bundle: ${compiledHandlers.length} handlers`);\n }\n\n return bundle;\n }\n\n /**\n * Generate the bundle code (dispatches to correct mode)\n */\n function generateBundle(): string {\n if (mode === 'compile') {\n return generateCompiledBundleCode();\n }\n return generateInterpretBundle();\n }\n\n return {\n name: 'vite-plugin-hyperfixi',\n enforce: 'pre' as const,\n\n /**\n * Configure plugin based on Vite mode\n */\n async configResolved(config: ResolvedConfig) {\n isDev = config.command === 'serve';\n\n if (options.debug) {\n console.log('[hyperfixi] Plugin initialized, mode:', isDev ? 'development' : 'production');\n }\n\n // Lazy-load server-bridge if configured\n if (options.serverBridge) {\n await loadServerBridge(options.debug);\n }\n },\n\n /**\n * Store server reference and pre-scan HTML files for HMR\n */\n async configureServer(_server: ViteDevServer) {\n server = _server;\n\n // Pre-scan project to detect hyperscript before first request\n const cwd = _server.config.root;\n if (options.debug) {\n console.log('[hyperfixi] Pre-scanning project:', cwd);\n }\n\n const scannedFiles = await scanner.scanProject(cwd);\n aggregator.loadFromScan(scannedFiles);\n\n // Domain scanning (if configured)\n if (domainScanner && domainAggregator) {\n for (const [filePath] of scannedFiles) {\n // Re-read file content for domain scanning\n try {\n const fs = await import('fs');\n const content = fs.readFileSync(filePath, 'utf-8');\n if (domainScanner.hasAnyDomainUsage(content)) {\n const domainUsages = domainScanner.scan(content, filePath);\n if (domainUsages.length > 0) {\n domainAggregator.add(filePath, domainUsages);\n }\n }\n } catch {\n // File may have been deleted between scan and domain scan\n }\n }\n\n if (options.debug) {\n const domainSummary = domainAggregator.getUsage();\n console.log('[hyperfixi] Domain pre-scan:', domainSummary);\n }\n }\n\n if (options.debug) {\n const summary = aggregator.getSummary();\n console.log('[hyperfixi] Pre-scan complete:', summary);\n }\n },\n\n /**\n * Resolve virtual module imports\n */\n resolveId(id: string) {\n if (IMPORT_ALIASES.includes(id)) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n return null;\n },\n\n /**\n * Load the virtual module with generated bundle\n */\n load(id: string) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n return generateBundle();\n }\n return null;\n },\n\n /**\n * Scan files during transform for hyperscript usage\n */\n transform(code: string, id: string) {\n if (!scanner.shouldScan(id)) {\n return null;\n }\n\n // In compile mode, we compile scripts and transform HTML\n if (mode === 'compile' && !isDev) {\n // Extract and compile all scripts from this file\n const scripts = extractScripts(code);\n\n for (const script of scripts) {\n compileScript(script);\n }\n\n // Transform HTML to use data-h attributes\n const result = transformHTML(code, handlerMap, fallbackScripts);\n\n if (result.modified) {\n if (options.debug) {\n console.log(`[hyperfixi] Transformed: ${id.split('/').pop()}`);\n }\n return { code: result.code, map: null };\n }\n\n return null;\n }\n\n // Interpret mode: just scan for usage\n const usage = scanner.scan(code, id);\n const changed = aggregator.add(id, usage);\n\n // Domain scanning (detection only)\n if (domainScanner && domainAggregator && domainScanner.hasAnyDomainUsage(code)) {\n const domainUsages = domainScanner.scan(code, id);\n if (domainUsages.length > 0) {\n domainAggregator.add(id, domainUsages);\n }\n }\n\n // Invalidate virtual module if usage changed\n if (changed && server) {\n // Debounce invalidation slightly to batch multiple file changes\n setImmediate(() => {\n const currentHash = computeUsageHash(aggregator.getUsage());\n if (currentHash !== lastUsageHash) {\n invalidateVirtualModule();\n }\n });\n }\n\n return null; // Don't modify source files in interpret mode\n },\n\n /**\n * Handle file changes in HMR\n */\n async handleHotUpdate(ctx: HmrContext) {\n const { file, read } = ctx;\n\n // Check if a scanned file was changed\n if (scanner.shouldScan(file)) {\n try {\n // Read the updated file content and re-scan\n const content = await read();\n const usage = scanner.scan(content, file);\n const changed = aggregator.add(file, usage);\n\n if (options.debug) {\n console.log('[hyperfixi] HMR: Re-scanned', file.split('/').pop(), usage);\n }\n\n // Invalidate virtual module if usage changed\n if (changed) {\n const currentHash = computeUsageHash(aggregator.getUsage());\n if (currentHash !== lastUsageHash) {\n invalidateVirtualModule();\n }\n }\n\n // Re-generate server routes on HTML file changes (hash-based skip if unchanged)\n if (options.serverBridge && server) {\n await runServerBridge(server.config.root, options.serverBridge, options.debug);\n }\n } catch {\n // File was deleted, remove from aggregator\n if (aggregator.remove(file)) {\n invalidateVirtualModule();\n }\n }\n }\n\n return undefined;\n },\n\n /**\n * Scan entire project before production build\n */\n async buildStart() {\n if (!isDev) {\n // Reset compile mode state\n if (mode === 'compile') {\n resetCompiler();\n compiledHandlers.length = 0;\n handlerMap.clear();\n fallbackScripts.clear();\n needsLocals = false;\n needsGlobals = false;\n\n if (options.debug) {\n console.log('[hyperfixi] Compile mode: ready for build');\n }\n }\n\n // Production build: scan entire project\n const cwd = process.cwd();\n\n if (options.debug) {\n console.log('[hyperfixi] Scanning project for hyperscript usage...');\n }\n\n const scannedFiles = await scanner.scanProject(cwd);\n aggregator.loadFromScan(scannedFiles);\n\n // Domain scanning (if configured)\n if (domainScanner && domainAggregator) {\n for (const [filePath] of scannedFiles) {\n try {\n const fs = await import('fs');\n const content = fs.readFileSync(filePath, 'utf-8');\n if (domainScanner.hasAnyDomainUsage(content)) {\n const domainUsages = domainScanner.scan(content, filePath);\n if (domainUsages.length > 0) {\n domainAggregator.add(filePath, domainUsages);\n }\n }\n } catch {\n // File may have been deleted\n }\n }\n\n if (options.debug) {\n const domainSummary = domainAggregator.getUsage();\n console.log('[hyperfixi] Domain build scan:', domainSummary);\n }\n }\n\n // Configure multilingual aliases for compile mode\n if (mode === 'compile') {\n const usage = aggregator.getUsage();\n if (usage.detectedLanguages.size > 0) {\n const aliases = getMultilingualCommandAliases(\n usage.detectedLanguages as Set<SupportedLanguage>\n );\n if (Object.keys(aliases).length > 0) {\n setMultilingualAliases(aliases);\n if (options.debug) {\n console.log(\n `[hyperfixi] Compile mode: configured ${Object.keys(aliases).length} multilingual aliases`\n );\n }\n }\n }\n }\n\n if (options.debug) {\n const summary = aggregator.getSummary();\n console.log(`[hyperfixi] Found ${summary.fileCount} files with hyperscript:`, {\n commands: summary.commands,\n blocks: summary.blocks,\n positional: summary.positional,\n languages: summary.languages,\n });\n }\n\n // Server-bridge: full scan + generate on production build\n if (options.serverBridge) {\n await runServerBridge(cwd, options.serverBridge, options.debug, true);\n }\n }\n },\n } as Plugin;\n}\n\n// Default export for convenience\nexport default hyperfixi;\n"],"mappings":";AAOA,SAAS,oBAAoB,kCAAkC;;;ACQxD,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAOO,IAAM,UAAU;AAAA,EACrB,SAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,EAC5C,cAAc,CAAC,MAAM,MAAM,IAAI;AAAA,EAC/B,QAAQ,CAAC,MAAM,MAAM,IAAI;AAAA,EACzB,eAAe,CAAC,MAAM,IAAI;AAAA,EAC1B,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,KAAK;AACP;AAMO,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,cAAc,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA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","names":["match","FULL_RUNTIME_ONLY_COMMANDS","FULL_RUNTIME_ONLY_COMMANDS"]}
|
|
1
|
+
{"version":3,"sources":["../src/engine-modules.ts","../src/language-keywords.ts","../src/htmx-localized-attrs.ts","../src/scanner.ts","../src/aggregator.ts","../src/semantic-integration.ts","../src/generator.ts","../src/server-bridge-integration.ts","../src/domain-scanner.ts","../src/domain-aggregator.ts","../src/index.ts"],"sourcesContent":["/**\n * The engine's modules as this plugin's vocabulary.\n *\n * A bundle on `@hyperfixi/engine` is the list of grammar modules passed to\n * `register()`. This file derives, from the engine itself, which module each\n * command or feature keyword lives in: every module in `everything` is run\n * against a fresh grammar and the keys it added are read back. The plugin\n * therefore keeps no hand-copied keyword table. (The hybrid-parser era kept\n * three — `AVAILABLE_COMMANDS`, `LITE_PARSER_COMMANDS`, `FULL_RUNTIME_ONLY_COMMANDS`\n * in core's bundle-generator — and the scanner's regex was built from them.)\n *\n * Modules that add no keyword (expression kinds, conversions, cookies) are\n * selected by the usage flags the scanner reports instead; see `resolveModules`.\n */\n\nimport * as engine from '@hyperfixi/engine';\nimport { createGrammar, everything, type Module } from '@hyperfixi/engine';\n\nexport interface EngineModuleInfo {\n /** The module's export name on `@hyperfixi/engine` (what the bundle imports). */\n name: string;\n /** Command keywords the module adds to the grammar (`toggle`, `call`, `for`, …). */\n commands: readonly string[];\n /** Feature keywords it adds (`on`, `def`, `live`, …). */\n features: readonly string[];\n}\n\nfunction exportNameOf(mod: Module): string {\n for (const [name, value] of Object.entries(engine)) {\n if (value === mod) return name;\n }\n throw new Error('[hyperfixi] an engine module in `everything` is not a named export');\n}\n\n/** Every module in the engine's `everything`, in registration order, with the keywords it adds. */\nexport const ENGINE_MODULES: readonly EngineModuleInfo[] = everything.map(mod => {\n const grammar = createGrammar();\n mod(grammar);\n return {\n name: exportNameOf(mod),\n // The template text line registers under a keyword no identifier can be\n // spelled as (`#text`); it is not something a scan can find.\n commands: Object.keys(grammar.commands).filter(k => /^[a-z]+$/.test(k)),\n features: Object.keys(grammar.features),\n };\n});\n\nconst byName = new Map(ENGINE_MODULES.map(m => [m.name, m]));\n\n/** Command keyword → module export name. */\nexport const COMMAND_KEYWORDS: ReadonlyMap<string, string> = new Map(\n ENGINE_MODULES.flatMap(m => m.commands.map(k => [k, m.name] as const))\n);\n\n/** Feature keyword → module export name. */\nexport const FEATURE_KEYWORDS: ReadonlyMap<string, string> = new Map(\n ENGINE_MODULES.flatMap(m => m.features.map(k => [k, m.name] as const))\n);\n\n/**\n * Every keyword the engine knows, for the scanner's word regex. Left out: `on`\n * (every handler has one), `if` (the scanner reports it as a block), and the\n * reactive features `live` / `when` / `bind` (the scanner's reactivity\n * detection reports those, and the dev-server cache key reads that flag).\n */\nconst NOT_SCANNED = new Set(['on', 'if', 'live', 'when', 'bind']);\nexport const SCANNABLE_KEYWORDS: readonly string[] = [\n ...new Set([...COMMAND_KEYWORDS.keys(), ...FEATURE_KEYWORDS.keys()]),\n]\n .filter(k => !NOT_SCANNED.has(k))\n .sort();\n\n/** Block names the scanner reports, and the modules each needs. */\nconst BLOCK_MODULES: Readonly<Record<string, readonly string[]>> = {\n if: ['ifCommand'],\n repeat: ['repeat', 'loopControl'],\n for: ['repeat', 'loopControl'],\n while: ['repeat', 'loopControl'],\n fetch: ['fetchCommand'],\n};\n\n/**\n * Modules every generated bundle registers. `on` is the handler feature; the\n * conversions (`as Number`, `as JSON`, …) cost 0.5 KB and no scan can tell an\n * `as` conversion from the word.\n */\nconst ALWAYS: readonly string[] = ['on', 'conversions'];\n\n/** What a scan reports, reduced to what module selection needs. */\nexport interface ModuleUsage {\n /** Command and feature keywords seen (the scanner's `commands` set, plus `extraCommands`). */\n commands: Iterable<string>;\n /** Blocks seen (`if`, `repeat`, `for`, `while`, `fetch`). */\n blocks: Iterable<string>;\n /** Positional / collection / postfix expression kinds seen (the `expressionsExtra` module). */\n positional: boolean;\n /** `live`, `when`, `bind` or a `^var`: the reactivity modules. */\n reactivity: boolean;\n /** `new X(…)` seen: the `construct` addition. */\n construct?: boolean;\n /** `cookies` seen. */\n cookies?: boolean;\n}\n\nexport interface ResolvedModules {\n /** Export names to register, in `everything` order (deterministic output). */\n modules: string[];\n /** Scanned command names the engine has no module for (a dropped core-only form, or a false positive). */\n unknown: string[];\n}\n\n/** Choose the engine modules a usage needs. */\nexport function resolveModules(usage: ModuleUsage): ResolvedModules {\n const wanted = new Set<string>(ALWAYS);\n const unknown: string[] = [];\n\n for (const name of usage.commands) {\n const mod = COMMAND_KEYWORDS.get(name) ?? FEATURE_KEYWORDS.get(name);\n if (mod) wanted.add(mod);\n else if (!(name in BLOCK_MODULES)) unknown.push(name);\n }\n for (const block of usage.blocks) {\n for (const mod of BLOCK_MODULES[block] ?? []) wanted.add(mod);\n }\n if (usage.positional) wanted.add('expressionsExtra');\n if (usage.reactivity) {\n wanted.add('reactivity');\n wanted.add('liveTemplates');\n }\n if (usage.construct) wanted.add('construct');\n if (usage.cookies) wanted.add('cookies');\n // `toggle <element>` is the engine's addition to `toggle`; a scan cannot tell\n // `toggle .cls` from `toggle #dialog`, and the module is 0.2 KB.\n if (wanted.has('toggle')) wanted.add('toggleElement');\n\n const modules = ENGINE_MODULES.filter(m => wanted.has(m.name)).map(m => m.name);\n for (const name of wanted) {\n if (!byName.has(name)) throw new Error(`[hyperfixi] no engine module named ${name}`);\n }\n return { modules, unknown: [...new Set(unknown)].sort() };\n}\n","/**\n * Language Keywords for Detection\n *\n * Maps of keywords for each of the 24 supported languages.\n * Used by the scanner to detect which languages are used in hyperscript templates.\n *\n * Note: These are a representative subset of keywords - enough to reliably\n * detect language usage without including every possible keyword variant.\n */\n\nimport type { CustomLanguageKeywords } from './types';\n\n/**\n * All supported language codes.\n */\nexport const SUPPORTED_LANGUAGES = [\n 'en',\n 'es',\n 'pt',\n 'fr',\n 'de',\n 'it',\n 'vi', // Western (Latin script)\n 'pl',\n 'ru',\n 'uk', // Slavic (Latin/Cyrillic)\n 'ja',\n 'zh',\n 'ko', // East Asian\n 'ar', // RTL (Arabic script)\n 'he', // RTL (Hebrew script)\n 'hi',\n 'bn', // South Asian (Indic scripts)\n 'th', // Southeast Asian (Thai script)\n 'tr', // Agglutinative Latin\n 'id',\n 'ms', // Malay (Latin script, closely related to id)\n 'sw',\n 'qu', // Other\n 'tl', // Tagalog (auto-added)\n] as const;\n\nexport type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\n/**\n * Regional bundle mappings.\n */\nexport const REGIONS = {\n western: ['en', 'es', 'pt', 'fr', 'de', 'it'] as SupportedLanguage[],\n 'east-asian': ['ja', 'zh', 'ko'] as SupportedLanguage[],\n slavic: ['pl', 'ru', 'uk'] as SupportedLanguage[],\n 'south-asian': ['hi', 'bn'] as SupportedLanguage[],\n priority: [\n 'en',\n 'es',\n 'pt',\n 'fr',\n 'de',\n 'it',\n 'ja',\n 'zh',\n 'ko',\n 'ar',\n 'tr',\n 'ru',\n 'hi',\n ] as SupportedLanguage[],\n all: SUPPORTED_LANGUAGES as unknown as SupportedLanguage[],\n};\n\n/**\n * Japanese keywords (hiragana, katakana, kanji).\n * Unique script makes detection straightforward.\n */\nexport const JAPANESE_KEYWORDS = new Set([\n '切り替え',\n '切り替える',\n 'トグル',\n 'トグルする',\n '追加',\n '追加する',\n '加える',\n '削除',\n '削除する',\n '取り除く',\n '表示',\n '表示する',\n '見せる',\n '隠す',\n '非表示',\n '非表示にする',\n '設定',\n '設定する',\n '増加',\n '増やす',\n 'インクリメント',\n '減少',\n '減らす',\n 'デクリメント',\n '引き金',\n '発火',\n 'トリガー',\n '送る',\n '送信',\n 'もし',\n 'そうでなければ',\n 'それ以外',\n '繰り返し',\n '繰り返す',\n 'リピート',\n '待つ',\n '待機',\n 'の間',\n '間',\n '結果',\n '最初',\n '最後',\n '次',\n '前',\n]);\n\n/**\n * Korean keywords (Hangul).\n * Unique script makes detection straightforward.\n */\nexport const KOREAN_KEYWORDS = new Set([\n '토글',\n '추가',\n '제거',\n '삭제',\n '보이다',\n '표시',\n '보이기',\n '보이세요',\n '숨기다',\n '숨기기',\n '숨기세요',\n '설정',\n '증가',\n '감소',\n '트리거',\n '보내다',\n '보내세요',\n '만약',\n '아니면',\n '반복',\n '대기',\n '동안',\n '결과',\n '첫번째',\n '마지막',\n '다음',\n '이전',\n]);\n\n/**\n * Chinese keywords (CJK characters).\n * Note: Some overlap with Japanese kanji, but context usually distinguishes.\n */\nexport const CHINESE_KEYWORDS = new Set([\n '切换',\n '添加',\n '加',\n '移除',\n '删除',\n '去掉',\n '显示',\n '展示',\n '隐藏',\n '设置',\n '设定',\n '增加',\n '减少',\n '触发',\n '发送',\n '如果',\n '否则',\n '重复',\n '等待',\n '持续',\n '结果',\n '第一个',\n '最后一个',\n '下一个',\n '上一个',\n]);\n\n/**\n * Arabic keywords (Arabic script).\n * RTL script makes detection straightforward.\n */\nexport const ARABIC_KEYWORDS = new Set([\n 'بدّل',\n 'بدل',\n 'غيّر',\n 'غير',\n 'أضف',\n 'اضف',\n 'احذف',\n 'أزل',\n 'امسح',\n 'اظهر',\n 'أظهر',\n 'اعرض',\n 'اخف',\n 'أخفِ',\n 'اخفي',\n 'أخف',\n 'اضبط',\n 'عيّن',\n 'حدد',\n 'زِد',\n 'زد',\n 'ارفع',\n 'أنقص',\n 'انقص',\n 'قلل',\n 'تشغيل',\n 'أطلق',\n 'فعّل',\n 'أرسل',\n 'إذا',\n 'وإلا',\n 'خلاف ذلك',\n 'كرر',\n 'انتظر',\n 'بينما',\n 'نتيجة',\n 'أول',\n 'آخر',\n 'التالي',\n 'السابق',\n]);\n\n/**\n * Hebrew keywords (Hebrew script).\n * Auto-synced from semantic profile.\n */\nexport const HE_KEYWORDS = new Set([\n 'מתג',\n 'הדלק כבה',\n 'הוסף',\n 'הסר',\n 'מחק',\n 'הורד',\n 'הראה',\n 'הצג',\n 'הסתר',\n 'החבא',\n 'קבע',\n 'הגדר',\n 'הגדל',\n 'הוסף אחד',\n 'הקטן',\n 'הפחת',\n 'הפעל',\n 'שגר',\n 'שלח',\n 'אם',\n 'אחרת',\n 'אם לא',\n 'חזור',\n 'חכה',\n 'המתן',\n 'כל עוד',\n 'בזמן',\n 'תוצאה',\n 'אחרון',\n]);\n\n/**\n * Spanish keywords (Latin script with accents).\n * Distinguished by specific Spanish words.\n */\nexport const SPANISH_KEYWORDS = new Set([\n 'alternar',\n 'conmutar',\n 'agregar',\n 'añadir',\n 'quitar',\n 'eliminar',\n 'remover',\n 'sacar',\n 'borrar',\n 'mostrar',\n 'enseñar',\n 'muestra',\n 'ocultar',\n 'esconder',\n 'establecer',\n 'fijar',\n 'definir',\n 'establece',\n 'incrementar',\n 'aumentar',\n 'decrementar',\n 'disminuir',\n 'disparar',\n 'activar',\n 'enviar',\n 'envía',\n 'si',\n 'sino',\n 'de lo contrario',\n 'repetir',\n 'esperar',\n 'mientras',\n 'resultado',\n 'primero',\n 'primera',\n 'último',\n 'ultima',\n 'siguiente',\n 'anterior',\n]);\n\n/**\n * Portuguese keywords (Latin script with accents).\n * Distinguished by specific Portuguese words.\n */\nexport const PORTUGUESE_KEYWORDS = new Set([\n 'alternar',\n 'adicionar',\n 'acrescentar',\n 'remover',\n 'eliminar',\n 'apagar',\n 'remova',\n 'mostrar',\n 'exibir',\n 'ocultar',\n 'esconder',\n 'esconda',\n 'definir',\n 'configurar',\n 'defina',\n 'incrementar',\n 'aumentar',\n 'decrementar',\n 'diminuir',\n 'disparar',\n 'ativar',\n 'enviar',\n 'se',\n 'senão',\n 'repetir',\n 'esperar',\n 'aguardar',\n 'enquanto',\n 'resultado',\n 'primeiro',\n 'último',\n 'próximo',\n 'anterior',\n]);\n\n/**\n * French keywords (Latin script with accents).\n * Distinguished by specific French words.\n */\nexport const FRENCH_KEYWORDS = new Set([\n 'basculer',\n 'alterner',\n 'ajouter',\n 'supprimer',\n 'enlever',\n 'retirer',\n 'retire',\n 'montrer',\n 'afficher',\n 'montre',\n 'cacher',\n 'masquer',\n 'définir',\n 'établir',\n 'incrémenter',\n 'augmenter',\n 'décrémenter',\n 'diminuer',\n 'déclencher',\n 'envoyer',\n 'envoie',\n 'si',\n 'sinon',\n 'répéter',\n 'attendre',\n 'pendant',\n 'résultat',\n 'premier',\n 'dernier',\n 'suivant',\n 'précédent',\n]);\n\n/**\n * German keywords (Latin script with umlauts).\n * Distinguished by specific German words.\n */\nexport const GERMAN_KEYWORDS = new Set([\n 'umschalten',\n 'wechseln',\n 'hinzufügen',\n 'entfernen',\n 'löschen',\n 'zeigen',\n 'anzeigen',\n 'verbergen',\n 'verstecken',\n 'festlegen',\n 'definieren',\n 'erhöhen',\n 'verringern',\n 'vermindern',\n 'auslösen',\n 'senden',\n 'schicken',\n 'falls',\n 'sofern',\n 'sonst',\n 'ansonsten',\n 'wiederholen',\n 'warten',\n 'solange',\n 'während',\n 'ergebnis',\n 'erste',\n 'letzte',\n 'nächste',\n 'vorherige',\n]);\n\n/**\n * Turkish keywords (Latin script with special chars).\n * Distinguished by Turkish-specific characters and words.\n */\nexport const TURKISH_KEYWORDS = new Set([\n 'değiştir',\n 'aç/kapat',\n 'ekle',\n 'kaldır',\n 'sil',\n 'göster',\n 'gizle',\n 'ayarla',\n 'belirle',\n 'artır',\n 'azalt',\n 'tetikle',\n 'gönder',\n 'eğer',\n 'yoksa',\n 'tekrarla',\n 'bekle',\n 'süresince',\n 'sonuç',\n 'ilk',\n 'sonuncu',\n 'sonraki',\n 'önceki',\n]);\n\n/**\n * Indonesian keywords (Latin script).\n * Distinguished by specific Indonesian words.\n */\nexport const INDONESIAN_KEYWORDS = new Set([\n 'alihkan',\n 'tambah',\n 'tambahkan',\n 'hapus',\n 'buang',\n 'hilangkan',\n 'tampilkan',\n 'perlihatkan',\n 'sembunyikan',\n 'tutup',\n 'atur',\n 'tetapkan',\n 'tingkatkan',\n 'naikkan',\n 'turunkan',\n 'kurangi',\n 'picu',\n 'jalankan',\n 'kirim',\n 'kirimkan',\n 'jika',\n 'kalau',\n 'bila',\n 'selainnya',\n 'lainnya',\n 'ulangi',\n 'tunggu',\n 'selama',\n 'hasil',\n 'pertama',\n 'terakhir',\n 'berikutnya',\n 'sebelumnya',\n]);\n\n/**\n * Malay keywords (Latin script).\n * Auto-synced from semantic profile.\n */\nexport const MS_KEYWORDS = new Set([\n 'togol',\n 'tukar',\n 'tambah',\n 'buang',\n 'padam',\n 'tunjuk',\n 'sembunyi',\n 'sorok',\n 'tetapkan',\n 'setkan',\n 'tambah_satu',\n 'kurang_satu',\n 'cetuskan',\n 'hantar',\n 'jika',\n 'kalau',\n 'kalau_tidak',\n 'jika_tidak',\n 'ulang',\n 'tunggu',\n 'selagi',\n 'semasa',\n 'hasil',\n 'pertama',\n 'terakhir',\n 'seterusnya',\n 'sebelumnya',\n]);\n\n/**\n * Swahili keywords (Latin script).\n * Distinguished by specific Swahili words.\n */\nexport const SWAHILI_KEYWORDS = new Set([\n 'badilisha',\n 'ongeza',\n 'ondoa',\n 'futa',\n 'toa',\n 'onyesha',\n 'ficha',\n 'mficho',\n 'seti',\n 'ongezeko',\n 'punguza',\n 'chochea',\n 'tuma',\n 'peleka',\n 'kama',\n 'ikiwa',\n 'vinginevyo',\n 'sivyo',\n 'rudia',\n 'subiri',\n 'ngoja',\n 'kadri',\n 'matokeo',\n 'kwanza',\n 'wamwisho',\n 'ijayo',\n 'iliyopita',\n]);\n\n/**\n * Quechua keywords (Latin script).\n * Distinguished by specific Quechua words.\n */\nexport const QUECHUA_KEYWORDS = new Set([\n 't',\n 'tikray',\n 'yapay',\n 'yapaykuy',\n 'qichuy',\n 'hurquy',\n 'anchuchiy',\n 'rikuchiy',\n 'qawachiy',\n 'pakay',\n 'pakakuy',\n 'churanay',\n 'kamaykuy',\n 'yapachiy',\n 'pisiyachiy',\n 'kuyuchiy',\n 'kichay',\n 'kachay',\n 'apachiy',\n 'sichus',\n 'manachus',\n 'hukniraq',\n 'kutipay',\n 'muyu',\n 'suyay',\n 'kaykamaqa',\n 'lluqsiy',\n 'ñawpaq',\n 'qhipa',\n 'qhipantin',\n 'ñawpaqnin',\n]);\n\n/**\n * Italian keywords (Latin script).\n * Distinguished by specific Italian words.\n */\nexport const ITALIAN_KEYWORDS = new Set([\n 'commutare',\n 'alternare',\n 'aggiungere',\n 'aggiungi',\n 'rimuovere',\n 'eliminare',\n 'togliere',\n 'mostrare',\n 'visualizzare',\n 'nascondere',\n 'impostare',\n 'definire',\n 'incrementare',\n 'aumentare',\n 'decrementare',\n 'diminuire',\n 'scatenare',\n 'attivare',\n 'inviare',\n 'se',\n 'altrimenti',\n 'ripetere',\n 'aspettare',\n 'attendere',\n 'mentre',\n 'risultato',\n 'primo',\n 'ultimo',\n 'prossimo',\n 'precedente',\n]);\n\n/**\n * Vietnamese keywords (Latin script with diacritics).\n * Distinguished by Vietnamese-specific diacritics and words.\n */\nexport const VIETNAMESE_KEYWORDS = new Set([\n 'chuyển đổi',\n 'bật tắt',\n 'chuyển',\n 'thêm',\n 'bổ sung',\n 'xóa',\n 'gỡ bỏ',\n 'loại bỏ',\n 'bỏ',\n 'hiển thị',\n 'hiện',\n 'ẩn',\n 'che',\n 'giấu',\n 'gán',\n 'thiết lập',\n 'tăng',\n 'tăng lên',\n 'giảm',\n 'giảm đi',\n 'kích hoạt',\n 'gửi',\n 'nếu',\n 'không thì',\n 'nếu không',\n 'lặp lại',\n 'chờ',\n 'đợi',\n 'chờ đợi',\n 'trong khi',\n 'kết quả',\n 'đầu tiên',\n 'cuối cùng',\n 'tiếp theo',\n 'trước đó',\n]);\n\n/**\n * Polish keywords (Latin script).\n * Distinguished by Polish-specific characters and words.\n */\nexport const POLISH_KEYWORDS = new Set([\n 'przełącz',\n 'przelacz',\n 'dodaj',\n 'usuń',\n 'usun',\n 'wyczyść',\n 'wyczysc',\n 'pokaż',\n 'pokaz',\n 'wyświetl',\n 'wyswietl',\n 'ukryj',\n 'schowaj',\n 'ustaw',\n 'określ',\n 'okresl',\n 'zwiększ',\n 'zwieksz',\n 'zmniejsz',\n 'wyzwól',\n 'wyzwol',\n 'wyślij',\n 'wyslij',\n 'jeśli',\n 'jesli',\n 'jeżeli',\n 'jezeli',\n 'inaczej',\n 'wpp',\n 'powtórz',\n 'powtorz',\n 'czekaj',\n 'poczekaj',\n 'dopóki',\n 'dopoki',\n 'podczas',\n 'wynik',\n 'pierwszy',\n 'ostatni',\n 'następny',\n 'poprzedni',\n]);\n\n/**\n * Russian keywords (Cyrillic script).\n * Unique script makes detection straightforward.\n */\nexport const RUSSIAN_KEYWORDS = new Set([\n 'переключить',\n 'переключи',\n 'добавить',\n 'добавь',\n 'удалить',\n 'удали',\n 'убрать',\n 'убери',\n 'показать',\n 'покажи',\n 'скрыть',\n 'скрой',\n 'спрятать',\n 'спрячь',\n 'установить',\n 'установи',\n 'задать',\n 'задай',\n 'увеличить',\n 'увеличь',\n 'уменьшить',\n 'уменьши',\n 'инициировать',\n 'запустить',\n 'запусти',\n 'отправить',\n 'отправь',\n 'если',\n 'иначе',\n 'повторить',\n 'повтори',\n 'ждать',\n 'жди',\n 'подожди',\n 'пока',\n 'результат',\n 'первый',\n 'последний',\n 'следующий',\n 'предыдущий',\n]);\n\n/**\n * Ukrainian keywords (Cyrillic script).\n * Unique script makes detection straightforward.\n */\nexport const UKRAINIAN_KEYWORDS = new Set([\n 'перемкнути',\n 'перемкни',\n 'додати',\n 'додай',\n 'видалити',\n 'видали',\n 'прибрати',\n 'прибери',\n 'показати',\n 'покажи',\n 'сховати',\n 'сховай',\n 'приховати',\n 'приховай',\n 'встановити',\n 'встанови',\n 'задати',\n 'задай',\n 'збільшити',\n 'збільш',\n 'зменшити',\n 'зменш',\n 'ініціювати',\n 'запустити',\n 'запусти',\n 'надіслати',\n 'надішли',\n 'якщо',\n 'інакше',\n 'повторити',\n 'повтори',\n 'чекати',\n 'чекай',\n 'зачекай',\n 'поки',\n 'результат',\n 'перший',\n 'останній',\n 'наступний',\n 'попередній',\n]);\n\n/**\n * Hindi keywords (Devanagari script).\n * Unique script makes detection straightforward.\n */\nexport const HINDI_KEYWORDS = new Set([\n 'टॉगल',\n 'बदलें',\n 'बदल',\n 'जोड़ें',\n 'जोड़',\n 'हटाएं',\n 'हटा',\n 'मिटाएं',\n 'दिखाएं',\n 'दिखा',\n 'छिपाएं',\n 'छिपा',\n 'सेट',\n 'निर्धारित',\n 'बढ़ाएं',\n 'बढ़ा',\n 'घटाएं',\n 'घटा',\n 'ट्रिगर',\n 'भेजें',\n 'भेज',\n 'अगर',\n 'यदि',\n 'वरना',\n 'नहीं तो',\n 'दोहराएं',\n 'दोहरा',\n 'प्रतीक्षा',\n 'रुकें',\n 'जब तक',\n 'परिणाम',\n 'पहला',\n 'अंतिम',\n 'अगला',\n 'पिछला',\n]);\n\n/**\n * Bengali keywords (Bengali script).\n * Unique script makes detection straightforward.\n */\nexport const BENGALI_KEYWORDS = new Set([\n 'টগল',\n 'যোগ',\n 'যোগ করুন',\n 'সরান',\n 'সরিয়ে ফেলুন',\n 'মুছুন',\n 'দেখান',\n 'দেখাও',\n 'লুকান',\n 'লুকাও',\n 'সেট',\n 'নির্ধারণ',\n 'বৃদ্ধি',\n 'বাড়ান',\n 'হ্রাস',\n 'কমান',\n 'ট্রিগার',\n 'পাঠান',\n 'পাঠাও',\n 'যদি',\n 'নতুবা',\n 'না হলে',\n 'পুনরাবৃত্তি',\n 'বার বার',\n 'অপেক্ষা',\n 'যতক্ষণ',\n 'ফলাফল',\n 'প্রথম',\n 'শেষ',\n 'পরবর্তী',\n 'আগের',\n]);\n\n/**\n * Thai keywords (Thai script).\n * Unique script makes detection straightforward.\n */\nexport const THAI_KEYWORDS = new Set([\n 'สลับ',\n 'เพิ่ม',\n 'ลบ',\n 'ลบออก',\n 'แสดง',\n 'ซ่อน',\n 'ตั้ง',\n 'กำหนด',\n 'เพิ่มค่า',\n 'ลดค่า',\n 'ทริกเกอร์',\n 'ส่ง',\n 'ถ้า',\n 'หาก',\n 'ไม่งั้น',\n 'ไม่เช่นนั้น',\n 'ทำซ้ำ',\n 'รอ',\n 'ในขณะที่',\n 'ผลลัพธ์',\n 'แรก',\n 'สุดท้าย',\n 'ถัดไป',\n 'ก่อนหน้า',\n]);\n\n/**\n * Tagalog keywords (Latin script).\n * TODO: Fill in keywords after completing the semantic profile.\n * Run 'npm run sync-keywords' to auto-populate from profile.\n */\nexport const TL_KEYWORDS = new Set([\n 'palitan',\n 'itoggle',\n 'idagdag',\n 'magdagdag',\n 'alisin',\n 'tanggalin',\n 'ipakita',\n 'magpakita',\n 'itago',\n 'magtago',\n 'itakda',\n 'magtakda',\n 'dagdagan',\n 'taasan',\n 'bawasan',\n 'ibaba',\n 'palitawin',\n 'magpatugtog',\n 'ipadala',\n 'magpadala',\n 'kung',\n 'kung_hindi',\n 'kundi',\n 'ulitin',\n 'paulit-ulit',\n 'maghintay',\n 'hintay',\n 'habang',\n 'resulta',\n 'una',\n 'huli',\n 'susunod',\n 'nakaraan',\n]);\n\n/**\n * Map of language code to keyword set.\n */\nexport const LANGUAGE_KEYWORDS: Record<SupportedLanguage, Set<string>> = {\n en: new Set(), // English is the default, no detection needed\n ja: JAPANESE_KEYWORDS,\n ko: KOREAN_KEYWORDS,\n zh: CHINESE_KEYWORDS,\n ar: ARABIC_KEYWORDS,\n he: HE_KEYWORDS,\n es: SPANISH_KEYWORDS,\n pt: PORTUGUESE_KEYWORDS,\n fr: FRENCH_KEYWORDS,\n de: GERMAN_KEYWORDS,\n it: ITALIAN_KEYWORDS,\n vi: VIETNAMESE_KEYWORDS,\n pl: POLISH_KEYWORDS,\n ru: RUSSIAN_KEYWORDS,\n uk: UKRAINIAN_KEYWORDS,\n hi: HINDI_KEYWORDS,\n bn: BENGALI_KEYWORDS,\n th: THAI_KEYWORDS,\n tr: TURKISH_KEYWORDS,\n id: INDONESIAN_KEYWORDS,\n ms: MS_KEYWORDS,\n sw: SWAHILI_KEYWORDS,\n qu: QUECHUA_KEYWORDS,\n tl: TL_KEYWORDS,\n};\n\n/**\n * Check if a script contains keywords from a specific language.\n * Returns true if any keyword from the language is found.\n *\n * Uses word boundary matching to avoid false positives from short keywords.\n * For non-Latin scripts (CJK, Arabic, etc.), simple includes is sufficient\n * since these characters don't appear in English/ASCII.\n */\nexport function containsLanguageKeywords(script: string, language: SupportedLanguage): boolean {\n const keywords = LANGUAGE_KEYWORDS[language];\n if (!keywords || keywords.size === 0) return false;\n\n // Non-Latin scripts can use simple includes (no risk of false positives)\n // Includes: CJK (ja, ko, zh), Arabic (ar), Hebrew (he), Cyrillic (ru, uk), Indic (hi, bn), Thai (th)\n const nonLatinLangs: SupportedLanguage[] = [\n 'ja',\n 'ko',\n 'zh',\n 'ar',\n 'he',\n 'ru',\n 'uk',\n 'hi',\n 'bn',\n 'th',\n ];\n if (nonLatinLangs.includes(language)) {\n for (const keyword of keywords) {\n if (script.includes(keyword)) {\n return true;\n }\n }\n return false;\n }\n\n // Latin-script languages need word boundary matching to avoid false positives\n // from short keywords like 'es', 'o', 'si', etc.\n const lowerScript = script.toLowerCase();\n for (const keyword of keywords) {\n // Skip very short keywords (2 chars or less) - too many false positives\n if (keyword.length <= 2) continue;\n\n // Use word boundary matching\n const pattern = new RegExp(`\\\\b${escapeRegExp(keyword.toLowerCase())}\\\\b`);\n if (pattern.test(lowerScript)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Detect all languages used in a hyperscript string.\n * Returns a Set of language codes found.\n *\n * Note: English is never detected (it's the default).\n * Only non-English languages are detected.\n */\nexport function detectLanguages(script: string): Set<SupportedLanguage> {\n const detected = new Set<SupportedLanguage>();\n\n for (const lang of SUPPORTED_LANGUAGES) {\n if (lang === 'en') continue; // Skip English\n\n if (containsLanguageKeywords(script, lang)) {\n detected.add(lang);\n }\n }\n\n return detected;\n}\n\n// =============================================================================\n// Custom Keywords Support\n// =============================================================================\n\n/**\n * Runtime keyword registry for custom/extended languages.\n * Use registerCustomKeywords() to add or extend language keywords.\n */\nconst customKeywordRegistry: Map<string, { keywords: Set<string>; isNonLatin: boolean }> =\n new Map();\n\n/**\n * Register custom keywords for a language.\n * Call this before scanning to add or extend language detection.\n *\n * @param code - Language code (e.g., 'es', 'my-lang')\n * @param config - Keyword configuration\n */\nexport function registerCustomKeywords(code: string, config: CustomLanguageKeywords): void {\n const existing = LANGUAGE_KEYWORDS[code as SupportedLanguage];\n const nonLatinLangs = ['ja', 'ko', 'zh', 'ar', 'ru', 'uk', 'hi', 'bn', 'th'];\n const isNonLatin = config.isNonLatin ?? nonLatinLangs.includes(code);\n\n if (config.extend && existing) {\n // Merge with existing keywords\n const merged = new Set([...existing, ...config.keywords]);\n customKeywordRegistry.set(code, { keywords: merged, isNonLatin });\n } else {\n // Replace or add new\n customKeywordRegistry.set(code, { keywords: config.keywords, isNonLatin });\n }\n}\n\n/**\n * Get keywords for a language, including custom registrations.\n */\nexport function getKeywordsForLanguage(code: string): Set<string> | undefined {\n const custom = customKeywordRegistry.get(code);\n if (custom) return custom.keywords;\n return LANGUAGE_KEYWORDS[code as SupportedLanguage];\n}\n\n/**\n * Check if a language uses non-Latin script.\n */\nexport function isNonLatinLanguage(code: string): boolean {\n const custom = customKeywordRegistry.get(code);\n if (custom) return custom.isNonLatin;\n const nonLatinLangs = ['ja', 'ko', 'zh', 'ar', 'ru', 'uk', 'hi', 'bn', 'th'];\n return nonLatinLangs.includes(code);\n}\n\n/**\n * Get all registered language codes (built-in + custom).\n */\nexport function getAllLanguageCodes(): string[] {\n const builtin = [...SUPPORTED_LANGUAGES];\n const custom = [...customKeywordRegistry.keys()];\n return [...new Set([...builtin, ...custom])];\n}\n\n/**\n * Clear all custom keyword registrations.\n */\nexport function clearCustomKeywords(): void {\n customKeywordRegistry.clear();\n}\n\n// =============================================================================\n// Region Detection\n// =============================================================================\n\n/**\n * Get the optimal regional bundle for a set of detected languages.\n * Returns the smallest bundle that covers all detected languages.\n */\nexport function getOptimalRegion(\n languages: Set<SupportedLanguage>\n): 'western' | 'east-asian' | 'slavic' | 'south-asian' | 'priority' | 'all' | null {\n if (languages.size === 0) return null;\n\n const langArray = [...languages];\n\n // Check if all languages fit in western bundle\n if (langArray.every(l => REGIONS.western.includes(l))) {\n return 'western';\n }\n\n // Check if all languages fit in east-asian bundle\n if (langArray.every(l => REGIONS['east-asian'].includes(l))) {\n return 'east-asian';\n }\n\n // Check if all languages fit in slavic bundle\n if (langArray.every(l => REGIONS.slavic.includes(l))) {\n return 'slavic';\n }\n\n // Check if all languages fit in south-asian bundle\n if (langArray.every(l => REGIONS['south-asian'].includes(l))) {\n return 'south-asian';\n }\n\n // Check if all languages fit in priority bundle\n if (langArray.every(l => REGIONS.priority.includes(l))) {\n return 'priority';\n }\n\n // Need full bundle\n return 'all';\n}\n","/**\n * Localized htmx-compat attribute name maps for the scanner.\n *\n * The vocab generator at `packages/htmx-adapter/scripts/gen-htmx-vocab.mjs`\n * emits per-language vocab modules under `packages/htmx-adapter/vocab/`.\n * Those modules drive the runtime orchestrator. The scanner needs the\n * same information at build time so it can route projects authored in\n * non-English languages to the correct bundle.\n *\n * Re-sync this file whenever the vocab regenerates:\n *\n * npm run sync-htmx-vocab --prefix packages/vite-plugin\n *\n * Drift detection happens via a unit test that re-derives the maps from\n * `packages/htmx-adapter/vocab/*.js` and compares against this file's\n * contents.\n */\n\n/**\n * Localized names that mean `hx-live` (htmx v4 reactive expression).\n * Used to set `needsHxLive` + `needsReactivity` for non-English authors.\n *\n * Auto-derived from `packages/htmx-adapter/vocab/*.js`. Re-sync if vocab\n * changes (see file-level comment).\n */\nexport const HX_LIVE_LOCALIZED: ReadonlySet<string> = new Set([\n // Each entry is the suffix after the `hx-` prefix.\n 'مباشر', // ar\n 'লাইভ', // bn\n 'direkt', // de\n 'en-vivo', // es\n 'en-direct', // fr\n 'חי', // he\n 'लाइव', // hi\n 'langsung', // id\n 'in-diretta', // it\n 'ライブ', // ja\n '실시간', // ko\n 'langsung', // ms\n 'na-żywo', // pl\n 'ao-vivo', // pt\n 'kawsachkaq', // qu\n 'в-прямом-эфире', // ru\n 'moja-kwa-moja', // sw\n 'ไลฟ์', // th\n 'canlı', // tr\n 'наживо', // uk\n 'trực-tiếp', // vi\n '实时', // zh\n]);\n\n/**\n * Build a single regex that matches any localized form of `hx-live`.\n * Anchored on word boundary + attribute-assignment to avoid matching\n * inside JS strings or partial words.\n */\nexport function buildLocalizedHxLivePattern(): RegExp {\n const suffixes = [...HX_LIVE_LOCALIZED]\n .map(s => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('|');\n // Unicode mode required for Hebrew/Arabic/CJK character classes.\n return new RegExp(`\\\\bhx-(?:${suffixes})\\\\s*=\\\\s*[\"']`, 'u');\n}\n\n/**\n * Any `sse-*` attribute (English or localized) triggers needsSSE.\n * The htmx-compat layer scopes SSE features to attributes inside the\n * `sse-` namespace, so namespace-only matching is correct.\n */\nexport const SSE_NS_PATTERN = /\\bsse-[\\w\\-\\p{L}]+\\s*=\\s*[\"']/u;\n\n/** Any `ws-*` attribute triggers needsWS — see SSE_NS_PATTERN. */\nexport const WS_NS_PATTERN = /\\bws-[\\w\\-\\p{L}]+\\s*=\\s*[\"']/u;\n","/**\n * Scanner\n *\n * Detects hyperscript usage in source files by scanning for _=\"...\" attributes.\n * Also detects non-English language keywords for multilingual semantic support.\n */\n\nimport type { FileUsage, HyperfixiPluginOptions, HtmxUsage } from './types';\nimport { SCANNABLE_KEYWORDS } from './engine-modules';\nimport { detectLanguages } from './language-keywords';\nimport { buildLocalizedHxLivePattern, SSE_NS_PATTERN, WS_NS_PATTERN } from './htmx-localized-attrs';\n\n/**\n * Command-detection pattern, derived from the engine's own grammar (every\n * command and feature keyword its modules register) instead of a hand-maintained\n * list. The earlier list came from core's bundle-generator and had drifted once\n * (`empty` reached core without reaching the regex). A false positive only costs\n * bundle size, never correctness: an unknown name selects no module.\n *\n * `live` / `when` / `bind` are in the list (they are engine features) and ALSO\n * handled by the reactivity detection below, which the dev-server cache key reads.\n */\nconst COMMAND_PATTERN_SOURCE = `\\\\b(${SCANNABLE_KEYWORDS.join('|')})\\\\b`;\n\n// htmx/fixi attribute patterns\nconst HTMX_REQUEST_PATTERN =\n /\\b(hx-get|hx-post|hx-put|hx-patch|hx-delete)\\s*=\\s*[\"']([^\"']+)[\"']/gi;\nconst FIXI_ACTION_PATTERN = /\\bfx-action\\s*=\\s*[\"']([^\"']+)[\"']/gi;\nconst FIXI_METHOD_PATTERN = /\\bfx-method\\s*=\\s*[\"'](GET|POST|PUT|PATCH|DELETE)[\"']/gi;\nconst HTMX_SWAP_PATTERN = /\\b(hx-swap|fx-swap)\\s*=\\s*[\"']([^\"']+)[\"']/gi;\nconst HTMX_TARGET_PATTERN = /\\b(hx-target|fx-target)\\s*=\\s*[\"']([^\"']+)[\"']/gi;\nconst HTMX_TRIGGER_PATTERN = /\\b(hx-trigger|fx-trigger)\\s*=\\s*[\"']([^\"']+)[\"']/gi;\nconst HTMX_URL_PATTERN = /\\b(hx-push-url|hx-replace-url)\\s*=\\s*[\"'][^\"']+[\"']/gi;\nconst HTMX_CONFIRM_PATTERN = /\\bhx-confirm\\s*=\\s*[\"']/gi;\nconst HTMX_ON_PATTERN = /\\bhx-on:(\\w+)\\s*=\\s*[\"']([^\"']+)[\"']/g;\n\n// htmx v4 reactive/streaming surface (English-form attributes).\nconst HX_LIVE_PATTERN = /\\bhx-live\\s*=\\s*[\"']/i;\nconst SSE_CONNECT_PATTERN = /\\bsse-connect\\s*=\\s*[\"']/i;\nconst SSE_SWAP_PATTERN = /\\bsse-swap\\s*=\\s*[\"']/i;\nconst WS_CONNECT_PATTERN = /\\bws-connect\\s*=\\s*[\"']/i;\nconst WS_SEND_PATTERN = /\\bws-send(\\s*=\\s*[\"']|\\b)/i;\n\n// Localized v4 attribute patterns (see ./htmx-localized-attrs.ts).\n// Built once at module load so the regex's literal-set is fixed.\nconst HX_LIVE_LOCALIZED_PATTERN = buildLocalizedHxLivePattern();\n\n/**\n * Phase 8: localized htmx-compat attribute names. Vocab modules under\n * `packages/htmx-adapter/vocab/` emit per-language maps like\n * `hx-obtener` (es) → `hx-get`\n * `hx-取得` (ja) → `hx-get`\n * `sse-conectar`(es) → `sse-connect`\n *\n * The scanner needs to recognize these so projects authoring in\n * Spanish/Japanese/etc. still get the htmx-compat bundle. The pattern\n * matches `hx-`/`sse-`/`ws-` followed by any identifier characters\n * (including Unicode), which covers both English and localized forms.\n * Bare `hx-` / `sse-` / `ws-` (with no suffix) and English forms\n * already matched by the named patterns above contribute too — the\n * generic match is a superset.\n */\nconst LOCALIZED_HX_PATTERN = /\\b(hx|sse|ws)-[\\w\\-\\p{L}]+\\s*=\\s*[\"']/u;\n\n/**\n * `bind <var> to <expr>.<property>` inside `_=` bodies. Matches both the\n * default `$var` form and possessive (`me's value`) syntax. The trailing\n * `.<ident>` is what makes this \"explicit property\" bind — it's also\n * possible to write `bind $x to <element>` without a property, but that\n * path is the auto-detect form and doesn't itself signal \"needs the\n * Phase 1 bind-to-property addition\" beyond what plain reactivity needs.\n */\nconst BIND_TO_PROPERTY_PATTERN = /\\bbind\\s+\\S+\\s+to\\s+\\S+\\.\\w+/i;\n\n/**\n * Converts include/exclude options to RegExp\n */\nfunction toRegex(pattern: RegExp | string[] | undefined, defaultPattern: RegExp): RegExp {\n if (!pattern) return defaultPattern;\n if (pattern instanceof RegExp) return pattern;\n if (Array.isArray(pattern)) {\n const escaped = pattern.map(p => p.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n return new RegExp(`(${escaped.join('|')})`);\n }\n return defaultPattern;\n}\n\n/**\n * Scanner class for detecting hyperscript usage in files\n */\nexport class Scanner {\n private include: RegExp;\n private exclude: RegExp;\n private debug: boolean;\n\n constructor(options: Pick<HyperfixiPluginOptions, 'include' | 'exclude' | 'debug'>) {\n this.include = toRegex(\n options.include,\n /\\.(html?|vue|svelte|jsx?|tsx?|astro|php|erb|ejs|hbs|handlebars)$/\n );\n this.exclude = toRegex(options.exclude, /node_modules|\\.git/);\n this.debug = options.debug ?? false;\n }\n\n /**\n * Check if a file should be scanned\n */\n shouldScan(id: string): boolean {\n return this.include.test(id) && !this.exclude.test(id);\n }\n\n /**\n * Scan code for hyperscript usage\n */\n scan(code: string, id: string): FileUsage {\n const usage: FileUsage = {\n commands: new Set(),\n blocks: new Set(),\n positional: false,\n detectedLanguages: new Set(),\n needsReactivity: false,\n needsBindToProperty: false,\n needsConstruct: false,\n needsCookies: false,\n };\n\n // Find all hyperscript in _=\"...\" attributes (single, double, backtick quotes)\n const attrPatterns = [\n /_\\s*=\\s*\"([^\"]+)\"/g, // _=\"...\"\n /_\\s*=\\s*'([^']+)'/g, // _='...'\n /_\\s*=\\s*`([^`]+)`/g, // _=`...`\n /_=\\{`([^`]+)`\\}/g, // _={`...`} (JSX)\n /_=\\{['\"]([^'\"]+)['\"]\\}/g, // _={\"...\"} or _={'...'} (JSX)\n ];\n\n for (const pattern of attrPatterns) {\n let match;\n while ((match = pattern.exec(code))) {\n this.analyzeScript(match[1], usage);\n }\n }\n\n // Also check for hyperscript in script tags\n const scriptPattern = /<script[^>]*type=[\"']?text\\/hyperscript[\"']?[^>]*>([^<]+)<\\/script>/gi;\n let match;\n while ((match = scriptPattern.exec(code))) {\n this.analyzeScript(match[1], usage);\n }\n\n // Scan for htmx/fixi attributes\n const htmxUsage = this.scanHtmxAttributes(code);\n\n if (htmxUsage.hasHtmxAttributes) {\n usage.htmx = htmxUsage;\n this.inferCommandsFromHtmx(htmxUsage, usage);\n\n // Scan hx-on:* handler values as hyperscript\n for (const handlerCode of htmxUsage.onHandlers) {\n this.analyzeScript(handlerCode, usage);\n }\n\n // Check hx-target for positional patterns\n if (/hx-target\\s*=\\s*[\"'](closest|next|previous|find)\\s/i.test(code)) {\n usage.positional = true;\n }\n\n // Roll htmx-attribute-driven reactivity flags up to the top level so\n // the aggregator and generator only have to consult one place.\n if (htmxUsage.needsReactivity) usage.needsReactivity = true;\n }\n\n if (\n this.debug &&\n (usage.commands.size > 0 ||\n usage.blocks.size > 0 ||\n usage.detectedLanguages.size > 0 ||\n usage.htmx?.hasHtmxAttributes)\n ) {\n console.log(`[hyperfixi] Scanned ${id}:`, {\n commands: [...usage.commands],\n blocks: [...usage.blocks],\n positional: usage.positional,\n languages: [...usage.detectedLanguages],\n htmx: usage.htmx\n ? {\n hasHtmxAttributes: usage.htmx.hasHtmxAttributes,\n hasFixiAttributes: usage.htmx.hasFixiAttributes,\n httpMethods: [...usage.htmx.httpMethods],\n swapStrategies: [...usage.htmx.swapStrategies],\n }\n : undefined,\n });\n }\n\n return usage;\n }\n\n /**\n * Analyze a hyperscript snippet for commands, blocks, and expressions\n */\n private analyzeScript(script: string, usage: FileUsage): void {\n // Detect commands (list derived from core — see SCANNABLE_COMMANDS above)\n const commandPattern = new RegExp(COMMAND_PATTERN_SOURCE, 'g');\n let match;\n while ((match = commandPattern.exec(script))) {\n usage.commands.add(match[1]);\n }\n\n // Detect blocks\n if (/\\bif\\b/.test(script)) usage.blocks.add('if');\n if (/\\bunless\\b/.test(script)) usage.blocks.add('if'); // unless uses same block as if\n // repeat pattern: handles literals, :localVars, $globalVars, and identifiers\n if (/\\brepeat\\s+(\\d+|:\\w+|\\$\\w+|[\\w.]+)\\s+times?\\b/i.test(script)) usage.blocks.add('repeat');\n if (/\\bfor\\s+(each|every)\\b/i.test(script)) usage.blocks.add('for');\n if (/\\bwhile\\b/.test(script)) usage.blocks.add('while');\n if (/\\bfetch\\b/.test(script)) usage.blocks.add('fetch');\n\n // Detect the expression kinds the engine keeps in its optional\n // `expressionsExtra` module: positional (`first`, `last`, `random`),\n // relative (`next`, `previous`), `closest`, the collection operators\n // (`where`, `sorted by`, `mapped to`, `split by`, `joined by`), `some`,\n // and `beep!`. Reported under the one `positional` flag.\n if (\n /\\b(first|last|next|previous|closest|parent|random)\\b/.test(script) ||\n /\\b(where|sorted\\s+by|mapped\\s+to|split\\s+by|joined\\s+by|some|beep!)/.test(script)\n ) {\n usage.positional = true;\n }\n\n // The engine's `new X(…)` addition (`construct`), and the cookies expression.\n if (/\\bnew\\s+[A-Z$_][\\w$.]*\\s*\\(/.test(script)) usage.needsConstruct = true;\n if (/\\bcookies\\b/.test(script)) usage.needsCookies = true;\n\n // Detect non-English languages for multilingual semantic support\n const languages = detectLanguages(script);\n for (const lang of languages) {\n usage.detectedLanguages.add(lang);\n }\n\n // Reactivity features inside `_=` bodies. `live`, `when`, and `bind` are\n // the engine's reactive features (its `reactivity` module). Their `^var`\n // form (DOM-scoped inherited globals) also implies reactivity.\n if (\n /\\blive\\b/.test(script) ||\n /\\bwhen\\s+\\S+\\s+changes\\b/i.test(script) ||\n /\\bbind\\b/.test(script) ||\n /\\^\\w/.test(script)\n ) {\n usage.needsReactivity = true;\n }\n // Explicit-property bind specifically: `bind <var> to <expr>.<prop>`.\n // Implies reactivity too — the auto-detect form already set it above.\n if (BIND_TO_PROPERTY_PATTERN.test(script)) {\n usage.needsBindToProperty = true;\n usage.needsReactivity = true;\n }\n }\n\n /**\n * Scan for htmx/fixi attributes\n */\n private scanHtmxAttributes(code: string): HtmxUsage {\n const usage: HtmxUsage = {\n hasHtmxAttributes: false,\n hasFixiAttributes: false,\n httpMethods: new Set(),\n swapStrategies: new Set(),\n onHandlers: [],\n triggerModifiers: new Set(),\n urlManagement: new Set(),\n usesConfirm: false,\n needsSwapTiming: false,\n needsHxLive: false,\n needsSSE: false,\n needsWS: false,\n needsBindToProperty: false,\n needsReactivity: false,\n };\n\n // Detect hx-get/post/put/patch/delete\n let match;\n const requestPattern = new RegExp(HTMX_REQUEST_PATTERN.source, 'gi');\n while ((match = requestPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n usage.httpMethods.add(match[1].replace('hx-', '').toUpperCase());\n }\n\n // Detect fx-action\n if (new RegExp(FIXI_ACTION_PATTERN.source, 'gi').test(code)) {\n usage.hasHtmxAttributes = true;\n usage.hasFixiAttributes = true;\n }\n\n // Detect fx-method\n const fixiMethodPattern = new RegExp(FIXI_METHOD_PATTERN.source, 'gi');\n while ((match = fixiMethodPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n usage.hasFixiAttributes = true;\n usage.httpMethods.add(match[1].toUpperCase());\n }\n\n // Detect swap strategies. `hx-swap` is a head style token followed by HCON\n // modifiers, so the first token is only a style when it isn't a `key:value`\n // pair — otherwise `hx-swap=\"swap:200ms\"` would register `swap:200ms` as a\n // strategy. `morph:innerHTML` is the exception: a style that looks like a pair.\n const swapPattern = new RegExp(HTMX_SWAP_PATTERN.source, 'gi');\n while ((match = swapPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n\n const spec = match[2].trim();\n const head = spec.split(/\\s+/)[0];\n if (head.startsWith('morph') || !/^\\S*:/.test(spec)) {\n usage.swapStrategies.add(head);\n }\n\n // `swap:`/`settle:` timings compile to `wait <n>ms`.\n if (/\\b(swap|settle):/.test(spec)) {\n usage.needsSwapTiming = true;\n }\n }\n\n // Detect trigger modifiers\n const triggerPattern = new RegExp(HTMX_TRIGGER_PATTERN.source, 'gi');\n while ((match = triggerPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n const trigger = match[2];\n if (/delay:/i.test(trigger)) usage.triggerModifiers.add('debounce');\n if (/throttle:/i.test(trigger)) usage.triggerModifiers.add('throttle');\n if (/\\bonce\\b/i.test(trigger)) usage.triggerModifiers.add('once');\n }\n\n // Detect URL management\n if (new RegExp(HTMX_URL_PATTERN.source, 'gi').test(code)) {\n usage.hasHtmxAttributes = true;\n if (/hx-push-url/i.test(code)) usage.urlManagement.add('push-url');\n if (/hx-replace-url/i.test(code)) usage.urlManagement.add('replace-url');\n }\n\n // Detect hx-confirm\n if (new RegExp(HTMX_CONFIRM_PATTERN.source, 'gi').test(code)) {\n usage.hasHtmxAttributes = true;\n usage.usesConfirm = true;\n }\n\n // Detect hx-on:* handlers\n const onPattern = new RegExp(HTMX_ON_PATTERN.source, 'g');\n while ((match = onPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n usage.onHandlers.push(match[2]);\n }\n\n // Check hx-target for positional patterns\n const targetPattern = new RegExp(HTMX_TARGET_PATTERN.source, 'gi');\n while ((match = targetPattern.exec(code))) {\n usage.hasHtmxAttributes = true;\n }\n\n // htmx v4 reactive / streaming surface — English-form attributes.\n if (HX_LIVE_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsHxLive = true;\n usage.needsReactivity = true;\n }\n if (SSE_CONNECT_PATTERN.test(code) || SSE_SWAP_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsSSE = true;\n }\n if (WS_CONNECT_PATTERN.test(code) || WS_SEND_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsWS = true;\n }\n\n // Phase 8: localized v4 attribute names. Authors writing Spanish\n // (`hx-en-vivo`, `sse-conectar`, `ws-conectar`), Japanese\n // (`hx-ライブ`, `sse-接続`), etc. need the same feature flags as the\n // English names.\n //\n // SSE/WS use namespace-only matching: any `sse-*` or `ws-*` localized\n // form means the project needs that feature. The htmx-compat layer\n // scopes those features to their namespace, so any localized name\n // inside the namespace is unambiguous.\n //\n // hx-live needs an explicit set of translated suffixes because the\n // `hx-*` namespace also covers non-reactive attributes (hx-get,\n // hx-target, etc.) that don't require v4 routing.\n if (HX_LIVE_LOCALIZED_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsHxLive = true;\n usage.needsReactivity = true;\n }\n if (!usage.needsSSE && SSE_NS_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsSSE = true;\n }\n if (!usage.needsWS && WS_NS_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n usage.needsWS = true;\n }\n\n // Final catch-all: pages authored with any other localized htmx\n // attribute name (`hx-obtener`, `hx-取得`, etc. — non-v4 features)\n // still need the htmx-compat bundle even if no English-form or v4\n // attribute matched. LOCALIZED_HX_PATTERN matches any hx-/sse-/ws-\n // attribute including Unicode suffixes.\n if (!usage.hasHtmxAttributes && LOCALIZED_HX_PATTERN.test(code)) {\n usage.hasHtmxAttributes = true;\n }\n\n return usage;\n }\n\n /**\n * Infer commands from htmx usage\n */\n private inferCommandsFromHtmx(htmx: HtmxUsage, usage: FileUsage): void {\n // HTTP requests need fetch block\n if (htmx.httpMethods.size > 0) {\n usage.blocks.add('fetch');\n usage.commands.add('put'); // Default swap uses put\n }\n\n // Swap strategy inference\n for (const swap of htmx.swapStrategies) {\n const strategy = swap.toLowerCase();\n // `morph`, `morph:innerHTML` and `morph:outerHTML` all emit `morph`.\n if (strategy.startsWith('morph')) {\n usage.commands.add('morph');\n if (strategy === 'morph:innerhtml') usage.commands.add('put');\n } else if (strategy === 'delete') {\n usage.commands.add('remove');\n } else {\n usage.commands.add('put');\n }\n }\n\n // `hx-swap=\"... swap:200ms settle:100ms\"` compiles to `wait <n>ms`.\n if (htmx.needsSwapTiming) {\n usage.commands.add('wait');\n }\n\n // hx-confirm needs if block\n if (htmx.usesConfirm) {\n usage.blocks.add('if');\n }\n }\n\n /**\n * Scan all files in a project directory\n * Used during production build to scan the entire codebase\n */\n async scanProject(dir: string): Promise<Map<string, FileUsage>> {\n const results = new Map<string, FileUsage>();\n\n try {\n const { glob } = await import('glob');\n const fs = await import('fs');\n\n const files = await glob('**/*.{html,htm,vue,svelte,js,jsx,ts,tsx,astro,php,erb,ejs,hbs}', {\n cwd: dir,\n ignore: ['node_modules/**', 'dist/**', '.git/**'],\n absolute: true,\n });\n\n for (const file of files) {\n if (this.shouldScan(file)) {\n try {\n const code = fs.readFileSync(file, 'utf-8');\n const usage = this.scan(code, file);\n if (\n usage.commands.size > 0 ||\n usage.blocks.size > 0 ||\n usage.positional ||\n usage.detectedLanguages.size > 0\n ) {\n results.set(file, usage);\n }\n } catch {\n // Skip files that can't be read\n }\n }\n }\n } catch (error) {\n console.warn('[hyperfixi] Error scanning project:', error);\n }\n\n return results;\n }\n}\n","/**\n * Aggregator\n *\n * Collects and aggregates hyperscript usage across all scanned files.\n */\n\nimport type { FileUsage, AggregatedUsage, HtmxUsage } from './types';\n\n/**\n * Aggregator class for collecting usage across files\n */\nexport class Aggregator {\n private fileUsage: Map<string, FileUsage> = new Map();\n private cachedUsage: AggregatedUsage | null = null;\n\n /**\n * Add or update usage for a file\n * @returns true if the overall usage changed\n */\n add(filePath: string, usage: FileUsage): boolean {\n const existing = this.fileUsage.get(filePath);\n\n // Check if anything changed\n if (existing) {\n const commandsEqual = this.setsEqual(existing.commands, usage.commands);\n const blocksEqual = this.setsEqual(existing.blocks, usage.blocks);\n const positionalEqual = existing.positional === usage.positional;\n const languagesEqual = this.setsEqual(existing.detectedLanguages, usage.detectedLanguages);\n const htmxEqual = this.htmxUsageEqual(existing.htmx, usage.htmx);\n const flagsEqual =\n !!existing.needsReactivity === !!usage.needsReactivity &&\n !!existing.needsBindToProperty === !!usage.needsBindToProperty &&\n !!existing.needsConstruct === !!usage.needsConstruct &&\n !!existing.needsCookies === !!usage.needsCookies;\n\n if (\n commandsEqual &&\n blocksEqual &&\n positionalEqual &&\n languagesEqual &&\n htmxEqual &&\n flagsEqual\n ) {\n return false; // No change\n }\n }\n\n // Update file usage\n this.fileUsage.set(filePath, usage);\n this.cachedUsage = null; // Invalidate cache\n\n return true;\n }\n\n /**\n * Remove a file from tracking (e.g., when deleted)\n * @returns true if the overall usage changed\n */\n remove(filePath: string): boolean {\n const existed = this.fileUsage.delete(filePath);\n if (existed) {\n this.cachedUsage = null;\n }\n return existed;\n }\n\n /**\n * Get aggregated usage across all files\n */\n getUsage(): AggregatedUsage {\n if (this.cachedUsage) {\n return this.cachedUsage;\n }\n\n const commands = new Set<string>();\n const blocks = new Set<string>();\n const detectedLanguages = new Set<string>();\n let positional = false;\n\n // Aggregate htmx usage\n const htmx: HtmxUsage = {\n hasHtmxAttributes: false,\n hasFixiAttributes: false,\n httpMethods: new Set(),\n swapStrategies: new Set(),\n onHandlers: [],\n triggerModifiers: new Set(),\n urlManagement: new Set(),\n usesConfirm: false,\n needsSwapTiming: false,\n needsHxLive: false,\n needsSSE: false,\n needsWS: false,\n needsBindToProperty: false,\n needsReactivity: false,\n };\n let needsReactivity = false;\n let needsBindToProperty = false;\n let needsConstruct = false;\n let needsCookies = false;\n\n for (const usage of this.fileUsage.values()) {\n for (const cmd of usage.commands) commands.add(cmd);\n for (const block of usage.blocks) blocks.add(block);\n for (const lang of usage.detectedLanguages) detectedLanguages.add(lang);\n if (usage.positional) positional = true;\n if (usage.needsReactivity) needsReactivity = true;\n if (usage.needsBindToProperty) needsBindToProperty = true;\n if (usage.needsConstruct) needsConstruct = true;\n if (usage.needsCookies) needsCookies = true;\n\n // Aggregate htmx usage\n if (usage.htmx) {\n if (usage.htmx.hasHtmxAttributes) htmx.hasHtmxAttributes = true;\n if (usage.htmx.hasFixiAttributes) htmx.hasFixiAttributes = true;\n for (const method of usage.htmx.httpMethods) htmx.httpMethods.add(method);\n for (const swap of usage.htmx.swapStrategies) htmx.swapStrategies.add(swap);\n htmx.onHandlers.push(...usage.htmx.onHandlers);\n for (const modifier of usage.htmx.triggerModifiers) htmx.triggerModifiers.add(modifier);\n for (const url of usage.htmx.urlManagement) htmx.urlManagement.add(url);\n if (usage.htmx.usesConfirm) htmx.usesConfirm = true;\n if (usage.htmx.needsSwapTiming) htmx.needsSwapTiming = true;\n if (usage.htmx.needsHxLive) htmx.needsHxLive = true;\n if (usage.htmx.needsSSE) htmx.needsSSE = true;\n if (usage.htmx.needsWS) htmx.needsWS = true;\n if (usage.htmx.needsBindToProperty) htmx.needsBindToProperty = true;\n if (usage.htmx.needsReactivity) {\n htmx.needsReactivity = true;\n needsReactivity = true;\n }\n }\n }\n\n this.cachedUsage = {\n commands,\n blocks,\n positional,\n detectedLanguages,\n htmx,\n needsReactivity,\n needsBindToProperty,\n needsConstruct,\n needsCookies,\n fileUsage: new Map(this.fileUsage),\n };\n\n return this.cachedUsage;\n }\n\n /**\n * Load usage from a project scan\n */\n loadFromScan(scannedFiles: Map<string, FileUsage>): void {\n this.fileUsage = new Map(scannedFiles);\n this.cachedUsage = null;\n }\n\n /**\n * Check if any hyperscript usage has been detected\n */\n hasUsage(): boolean {\n const usage = this.getUsage();\n return (\n usage.commands.size > 0 ||\n usage.blocks.size > 0 ||\n usage.positional ||\n usage.detectedLanguages.size > 0\n );\n }\n\n /**\n * Get summary for logging\n */\n getSummary(): {\n commands: string[];\n blocks: string[];\n positional: boolean;\n languages: string[];\n fileCount: number;\n } {\n const usage = this.getUsage();\n return {\n commands: [...usage.commands].sort(),\n blocks: [...usage.blocks].sort(),\n positional: usage.positional,\n languages: [...usage.detectedLanguages].sort(),\n fileCount: this.fileUsage.size,\n };\n }\n\n /**\n * Clear all tracked usage\n */\n clear(): void {\n this.fileUsage.clear();\n this.cachedUsage = null;\n }\n\n /**\n * Compare two sets for equality\n */\n private setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const item of a) {\n if (!b.has(item)) return false;\n }\n return true;\n }\n\n /**\n * Compare two HtmxUsage objects for equality\n */\n private htmxUsageEqual(a?: HtmxUsage, b?: HtmxUsage): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.hasHtmxAttributes === b.hasHtmxAttributes &&\n a.hasFixiAttributes === b.hasFixiAttributes &&\n this.setsEqual(a.httpMethods, b.httpMethods) &&\n this.setsEqual(a.swapStrategies, b.swapStrategies) &&\n this.setsEqual(a.triggerModifiers, b.triggerModifiers) &&\n this.setsEqual(a.urlManagement, b.urlManagement) &&\n a.usesConfirm === b.usesConfirm &&\n !!a.needsSwapTiming === !!b.needsSwapTiming &&\n // htmx / reactivity flags: these decide which engine modules the bundle\n // registers, so a change must count as \"usage changed\" or HMR serves a\n // stale bundle. They were omitted when the v4 surface landed (#623).\n !!a.needsHxLive === !!b.needsHxLive &&\n !!a.needsSSE === !!b.needsSSE &&\n !!a.needsWS === !!b.needsWS &&\n !!a.needsBindToProperty === !!b.needsBindToProperty &&\n !!a.needsReactivity === !!b.needsReactivity &&\n this.arraysEqual(a.onHandlers, b.onHandlers)\n );\n }\n\n private arraysEqual(a?: string[], b?: string[]): boolean {\n const aa = a ?? [];\n const bb = b ?? [];\n return aa.length === bb.length && aa.every((v, i) => v === bb[i]);\n }\n}\n","/**\n * Semantic Integration\n *\n * Handles semantic bundle selection and integration layer generation.\n * Used when multilingual semantic support is enabled.\n */\n\nimport type { HyperfixiPluginOptions } from './types';\nimport { REGIONS, type SupportedLanguage } from './language-keywords';\n\n/**\n * Multilingual command aliases.\n * Maps non-English command keywords to their English equivalents.\n */\nconst MULTILINGUAL_COMMAND_ALIASES: Partial<Record<SupportedLanguage, Record<string, string>>> = {\n ja: {\n トグル: 'toggle',\n 切り替え: 'toggle',\n 追加: 'add',\n 削除: 'remove',\n 表示: 'show',\n 隠す: 'hide',\n 非表示: 'hide',\n 設定: 'set',\n セット: 'set',\n 増加: 'increment',\n 減少: 'decrement',\n ログ: 'log',\n 出力: 'log',\n },\n ko: {\n 토글: 'toggle',\n 전환: 'toggle',\n 추가: 'add',\n 제거: 'remove',\n 삭제: 'remove',\n 표시: 'show',\n 숨기다: 'hide',\n 설정: 'set',\n 증가: 'increment',\n 감소: 'decrement',\n 로그: 'log',\n },\n zh: {\n 切换: 'toggle',\n 添加: 'add',\n 移除: 'remove',\n 删除: 'remove',\n 显示: 'show',\n 隐藏: 'hide',\n 设置: 'set',\n 设定: 'set',\n 增加: 'increment',\n 减少: 'decrement',\n 日志: 'log',\n 记录: 'log',\n },\n ar: {\n بدّل: 'toggle',\n بدل: 'toggle',\n أضف: 'add',\n اضف: 'add',\n أزل: 'remove',\n ازل: 'remove',\n احذف: 'remove',\n أظهر: 'show',\n اظهر: 'show',\n أخفِ: 'hide',\n اخف: 'hide',\n ضع: 'set',\n اضع: 'set',\n زِد: 'increment',\n أنقص: 'decrement',\n },\n es: {\n alternar: 'toggle',\n añadir: 'add',\n agregar: 'add',\n quitar: 'remove',\n eliminar: 'remove',\n mostrar: 'show',\n ocultar: 'hide',\n esconder: 'hide',\n establecer: 'set',\n fijar: 'set',\n incrementar: 'increment',\n decrementar: 'decrement',\n },\n pt: {\n alternar: 'toggle',\n adicionar: 'add',\n remover: 'remove',\n mostrar: 'show',\n esconder: 'hide',\n ocultar: 'hide',\n definir: 'set',\n incrementar: 'increment',\n decrementar: 'decrement',\n },\n fr: {\n basculer: 'toggle',\n ajouter: 'add',\n supprimer: 'remove',\n retirer: 'remove',\n afficher: 'show',\n montrer: 'show',\n cacher: 'hide',\n masquer: 'hide',\n définir: 'set',\n incrémenter: 'increment',\n décrémenter: 'decrement',\n },\n de: {\n umschalten: 'toggle',\n hinzufügen: 'add',\n entfernen: 'remove',\n löschen: 'remove',\n anzeigen: 'show',\n zeigen: 'show',\n verbergen: 'hide',\n verstecken: 'hide',\n setzen: 'set',\n festlegen: 'set',\n erhöhen: 'increment',\n verringern: 'decrement',\n },\n tr: {\n değiştir: 'toggle',\n değistir: 'toggle',\n ekle: 'add',\n kaldır: 'remove',\n kaldir: 'remove',\n sil: 'remove',\n göster: 'show',\n gizle: 'hide',\n sakla: 'hide',\n ayarla: 'set',\n belirle: 'set',\n arttır: 'increment',\n azalt: 'decrement',\n },\n id: {\n alih: 'toggle',\n beralih: 'toggle',\n tambah: 'add',\n hapus: 'remove',\n buang: 'remove',\n tampilkan: 'show',\n sembunyikan: 'hide',\n atur: 'set',\n tetapkan: 'set',\n tambahkan: 'increment',\n kurangi: 'decrement',\n },\n sw: {\n badilisha: 'toggle',\n ongeza: 'add',\n ondoa: 'remove',\n futa: 'remove',\n onyesha: 'show',\n ficha: 'hide',\n weka: 'set',\n sanidi: 'set',\n ongezea: 'increment',\n punguza: 'decrement',\n },\n qu: {\n tikray: 'toggle',\n yapay: 'add',\n qichuy: 'remove',\n pichay: 'remove',\n rikuchiy: 'show',\n pakay: 'hide',\n churay: 'set',\n pisiyachiy: 'decrement',\n },\n};\n\n/**\n * Get multilingual command aliases for detected languages.\n * Used by compile mode to configure the compiler with the right aliases.\n */\nexport function getMultilingualCommandAliases(\n languages: Set<SupportedLanguage>\n): Record<string, string> {\n const aliases: Record<string, string> = {};\n\n for (const lang of languages) {\n const langAliases = MULTILINGUAL_COMMAND_ALIASES[lang];\n if (langAliases) {\n Object.assign(aliases, langAliases);\n }\n }\n\n return aliases;\n}\n\n/**\n * Semantic bundle types available.\n * Single-language bundles are available for all 25 languages with semantic tokenizers.\n */\nexport type SemanticBundleType =\n // Single-language bundles (all 25 languages)\n | 'ar'\n | 'bn'\n | 'de'\n | 'en'\n | 'es'\n | 'fr'\n | 'he'\n | 'hi'\n | 'id'\n | 'it'\n | 'ja'\n | 'ko'\n | 'ms'\n | 'pl'\n | 'pt'\n | 'qu'\n | 'ru'\n | 'sw'\n | 'th'\n | 'tl'\n | 'tr'\n | 'uk'\n | 'vi'\n | 'zh'\n // Regional bundles\n | 'es-en'\n | 'western'\n | 'east-asian'\n | 'priority'\n | 'all';\n\n/**\n * Semantic configuration resolved from options and detected languages.\n */\nexport interface SemanticConfig {\n /** Whether semantic parsing is enabled */\n enabled: boolean;\n\n /** Which semantic bundle to use */\n bundleType: SemanticBundleType | null;\n\n /** All languages to support (detected + explicit) */\n languages: Set<SupportedLanguage>;\n\n /** Whether grammar transformation is enabled */\n grammarEnabled: boolean;\n}\n\n/**\n * Resolve semantic configuration from plugin options and detected languages.\n */\nexport function resolveSemanticConfig(\n options: HyperfixiPluginOptions,\n detectedLanguages: Set<string>\n): SemanticConfig {\n // Check if grammar is enabled (which implies semantic)\n const grammarEnabled = options.grammar ?? false;\n\n // Determine if semantic is enabled\n let semanticEnabled = grammarEnabled; // grammar implies semantic\n if (options.semantic === true || options.semantic === 'auto') {\n semanticEnabled = true;\n } else if (options.semantic === 'en') {\n semanticEnabled = true;\n } else if (options.semantic === false) {\n semanticEnabled = false;\n }\n\n // If not enabled, return early\n if (!semanticEnabled) {\n return {\n enabled: false,\n bundleType: null,\n languages: new Set(),\n grammarEnabled: false,\n };\n }\n\n // Collect all languages\n const languages = new Set<SupportedLanguage>();\n\n // Add detected languages\n for (const lang of detectedLanguages) {\n languages.add(lang as SupportedLanguage);\n }\n\n // Add explicitly configured languages\n if (options.languages) {\n for (const lang of options.languages) {\n languages.add(lang as SupportedLanguage);\n }\n }\n\n // Add extra languages\n if (options.extraLanguages) {\n for (const lang of options.extraLanguages) {\n languages.add(lang as SupportedLanguage);\n }\n }\n\n // Determine bundle type\n let bundleType = selectBundleType(options, languages);\n\n return {\n enabled: true,\n bundleType,\n languages,\n grammarEnabled,\n };\n}\n\n/**\n * Select the optimal semantic bundle type based on options and languages.\n */\nfunction selectBundleType(\n options: HyperfixiPluginOptions,\n languages: Set<SupportedLanguage>\n): SemanticBundleType {\n // If explicit region is set, use it\n if (options.region) {\n return options.region as SemanticBundleType;\n }\n\n // If semantic is 'en', use English-only bundle\n if (options.semantic === 'en') {\n return 'en';\n }\n\n // If explicit languages are set, find optimal bundle\n if (options.languages?.length) {\n return selectOptimalBundle(new Set(options.languages as SupportedLanguage[]));\n }\n\n // Use detected languages\n if (languages.size === 0) {\n // No languages detected, default to English\n return 'en';\n }\n\n return selectOptimalBundle(languages);\n}\n\n/**\n * All languages that have single-language ESM modules available.\n * These can be selected as individual bundle types for optimal tree-shaking.\n */\nconst SINGLE_LANGUAGE_BUNDLES: readonly string[] = [\n 'ar',\n 'bn',\n 'de',\n 'en',\n 'es',\n 'fr',\n 'he',\n 'hi',\n 'id',\n 'it',\n 'ja',\n 'ko',\n 'ms',\n 'pl',\n 'pt',\n 'qu',\n 'ru',\n 'sw',\n 'th',\n 'tl',\n 'tr',\n 'uk',\n 'vi',\n 'zh',\n] as const;\n\n/**\n * Select the smallest bundle that covers all specified languages.\n */\nexport function selectOptimalBundle(languages: Set<SupportedLanguage>): SemanticBundleType {\n if (languages.size === 0) {\n return 'en';\n }\n\n const langArray = [...languages];\n\n // Check single-language bundles (all 13 languages have individual bundles)\n if (langArray.length === 1) {\n const lang = langArray[0];\n if (SINGLE_LANGUAGE_BUNDLES.includes(lang)) {\n return lang as SemanticBundleType;\n }\n }\n\n // Check if en + es covers it (common bilingual case)\n if (langArray.length === 2 && langArray.includes('en') && langArray.includes('es')) {\n return 'es-en';\n }\n\n // Check if all languages fit in western bundle\n if (langArray.every(l => REGIONS.western.includes(l))) {\n return 'western';\n }\n\n // Check if all languages fit in east-asian bundle\n if (langArray.every(l => REGIONS['east-asian'].includes(l))) {\n return 'east-asian';\n }\n\n // Check if all languages fit in priority bundle\n if (langArray.every(l => REGIONS.priority.includes(l))) {\n return 'priority';\n }\n\n // Need full bundle\n return 'all';\n}\n\n/**\n * Estimated bundle sizes for each semantic bundle type.\n * Used for debug logging to help users understand size impact.\n * Sizes measured from minified bundles (January 2025).\n */\nexport const SEMANTIC_BUNDLE_SIZES: Record<SemanticBundleType, { raw: string; gzip: string }> = {\n // Single-language bundles (all 25 languages)\n ar: { raw: '66 KB', gzip: '~17 KB' },\n bn: { raw: '56 KB', gzip: '~14 KB' },\n de: { raw: '57 KB', gzip: '~14 KB' },\n en: { raw: '82 KB', gzip: '~20 KB' },\n es: { raw: '64 KB', gzip: '~16 KB' },\n fr: { raw: '57 KB', gzip: '~14 KB' },\n he: { raw: '56 KB', gzip: '~14 KB' },\n hi: { raw: '56 KB', gzip: '~14 KB' },\n id: { raw: '57 KB', gzip: '~14 KB' },\n it: { raw: '57 KB', gzip: '~14 KB' },\n ja: { raw: '67 KB', gzip: '~17 KB' },\n ko: { raw: '69 KB', gzip: '~18 KB' },\n ms: { raw: '56 KB', gzip: '~14 KB' },\n pl: { raw: '56 KB', gzip: '~14 KB' },\n pt: { raw: '56 KB', gzip: '~14 KB' },\n qu: { raw: '56 KB', gzip: '~14 KB' },\n ru: { raw: '56 KB', gzip: '~14 KB' },\n sw: { raw: '56 KB', gzip: '~14 KB' },\n th: { raw: '56 KB', gzip: '~14 KB' },\n tl: { raw: '56 KB', gzip: '~14 KB' },\n tr: { raw: '73 KB', gzip: '~18 KB' },\n uk: { raw: '56 KB', gzip: '~14 KB' },\n vi: { raw: '56 KB', gzip: '~14 KB' },\n zh: { raw: '58 KB', gzip: '~15 KB' },\n // Regional bundles\n 'es-en': { raw: '99 KB', gzip: '~25 KB' },\n western: { raw: '127 KB', gzip: '~30 KB' },\n 'east-asian': { raw: '99 KB', gzip: '~24 KB' },\n priority: { raw: '231 KB', gzip: '~48 KB' },\n all: { raw: '324 KB', gzip: '~61 KB' },\n};\n\n/**\n * Get the estimated size for a semantic bundle type.\n */\nexport function getSemanticBundleSize(bundleType: SemanticBundleType): {\n raw: string;\n gzip: string;\n} {\n return SEMANTIC_BUNDLE_SIZES[bundleType] ?? SEMANTIC_BUNDLE_SIZES.all;\n}\n\n/**\n * Languages that have per-language ESM subpath exports in @lokascript/semantic.\n * These can be imported individually: `import '@lokascript/semantic/languages/en'`\n *\n * All 25 languages with semantic tokenizers now have individual ESM modules.\n */\nconst LANGUAGES_WITH_ESM_EXPORTS = new Set([\n 'ar',\n 'bn',\n 'de',\n 'en',\n 'es',\n 'fr',\n 'he',\n 'hi',\n 'id',\n 'it',\n 'ja',\n 'ko',\n 'ms',\n 'pl',\n 'pt',\n 'qu',\n 'ru',\n 'sw',\n 'th',\n 'tl',\n 'tr',\n 'uk',\n 'vi',\n 'zh',\n]);\n\n/**\n * Get the import path for a semantic bundle type.\n *\n * For ES module usage (Vite, Rollup, etc.), we use '@lokascript/semantic/core'\n * which provides the core analyzer infrastructure without any language data.\n * Languages are imported separately as side-effect imports for tree-shaking.\n *\n * If any required language lacks an ESM subpath export, we fall back to the\n * full '@lokascript/semantic' entry which includes all languages.\n */\nexport function getSemanticBundleImport(_bundleType: SemanticBundleType): string {\n // Core entry provides createSemanticAnalyzer, buildAST, isLanguageSupported\n // without bundling any language data (~20 KB vs ~102 KB gzip)\n return '@lokascript/semantic/core';\n}\n\n/**\n * Resolve the set of language codes that need ESM imports for a given bundle type\n * and config languages.\n */\nexport function getLanguagesForBundleType(\n bundleType: SemanticBundleType,\n configLanguages: Set<SupportedLanguage>\n): Set<string> {\n const languages = new Set<string>(configLanguages);\n\n // Expand regional bundle types to their constituent languages\n switch (bundleType) {\n case 'western':\n REGIONS.western.forEach(l => languages.add(l));\n break;\n case 'east-asian':\n REGIONS['east-asian'].forEach(l => languages.add(l));\n break;\n case 'priority':\n REGIONS.priority.forEach(l => languages.add(l));\n break;\n case 'all':\n REGIONS.all.forEach(l => languages.add(l));\n break;\n case 'es-en':\n languages.add('en');\n languages.add('es');\n break;\n default:\n // Single language bundle type (e.g., 'en', 'ja') - add it\n if (typeof bundleType === 'string' && bundleType.length <= 3) {\n languages.add(bundleType);\n }\n break;\n }\n\n // Always ensure English is included as fallback\n languages.add('en');\n\n return languages;\n}\n\n/**\n * Check if all languages in the set have ESM subpath exports available.\n * @deprecated Use filterToAvailableLanguages() instead. This function used an\n * all-or-nothing approach that caused fallback to the full bundle when any\n * language lacked ESM exports. The new approach imports available languages\n * individually and skips unavailable ones.\n */\nexport function canUseCorePlusLanguages(languages: Set<string>): boolean {\n for (const lang of languages) {\n if (!LANGUAGES_WITH_ESM_EXPORTS.has(lang)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Filter a set of languages to only those with ESM subpath exports.\n * Languages without exports (e.g., 'it', 'ru', 'hi') are excluded since\n * they don't have semantic parser modules in @lokascript/semantic.\n *\n * Always ensures 'en' is included as a fallback.\n */\nexport function filterToAvailableLanguages(languages: Set<string>): Set<string> {\n const available = new Set<string>();\n for (const lang of languages) {\n if (LANGUAGES_WITH_ESM_EXPORTS.has(lang)) {\n available.add(lang);\n }\n }\n // Always ensure English is included\n available.add('en');\n return available;\n}\n\n/**\n * Generate the multilingual layer of the bundle.\n *\n * Text is the interchange: a non-English script is parsed in its language and\n * rendered to English as the engine reads it (`api.addSourceTransform`); the\n * attribute stays as written. Imports `@lokascript/semantic/core` plus one\n * `@lokascript/semantic/languages/<lang>` module per language, never the full\n * `@lokascript/semantic` index (1 MB source, every language). Languages without\n * an ESM module are skipped.\n *\n * (Until 4.0 this emitted a `parseWithSemantic` that built core's AST with\n * semantic's `buildAST` and fell back to the hybrid parser: the direct path,\n * retired with core's parser.)\n */\nexport function generateSemanticIntegrationCode(config: SemanticConfig): string {\n if (!config.enabled || !config.bundleType) {\n return '';\n }\n\n const resolvedLanguages = getLanguagesForBundleType(config.bundleType, config.languages);\n const availableLanguages = filterToAvailableLanguages(resolvedLanguages);\n const languages = [...config.languages].join(\"', '\");\n\n let code = `\n// =============================================================================\n// MULTILINGUAL (semantic) — translated as read; the attribute stays as written\n// =============================================================================\n\n// Core infrastructure (no language data bundled)\nimport { parseWithConfidence, render, isLanguageRegistered } from '@lokascript/semantic/core';\n\n// Register required languages (self-registering side-effect imports)\n`;\n const sortedLangs = [...availableLanguages].sort();\n for (const lang of sortedLangs) {\n code += `import '@lokascript/semantic/languages/${lang}';\\n`;\n }\n if (config.grammarEnabled) {\n // The translator comes from the SAME module as the parser (never a second stack).\n code += `\\nimport { translate } from '@lokascript/semantic/core';\\n`;\n }\n\n code += `\nconst SUPPORTED_SEMANTIC_LANGUAGES = ['${languages}', 'en'];\nconst SEMANTIC_CONFIDENCE_THRESHOLD = 0.7;\n\n/** The element's language: data-lang, data-hyperscript-lang, the lang cascade, the document's. */\nfunction resolveLanguage(elt) {\n const code =\n elt.getAttribute('data-lang') ||\n elt.closest?.('[data-hyperscript-lang]')?.getAttribute('data-hyperscript-lang') ||\n elt.closest?.('[lang]')?.getAttribute('lang') ||\n (typeof document !== 'undefined' ? document.documentElement?.lang : null);\n return code ? code.toLowerCase().split(/[-_]/)[0] : null;\n}\n\n/**\n * The engine's source transform: the English for a non-English script, or null\n * to leave the script as written (English, an unregistered language, a parse\n * below the confidence threshold, or a render that changed nothing).\n */\nfunction translateSource(src, elt) {\n const lang = elt ? resolveLanguage(elt) : null;\n if (!lang || lang === 'en' || !isLanguageRegistered(lang)) return null;\n try {\n const result = parseWithConfidence(src, lang);\n if (!result || !result.node || result.confidence < SEMANTIC_CONFIDENCE_THRESHOLD) return null;\n const english = render(result.node, 'en');\n return english && english !== src ? english : null;\n } catch {\n return null;\n }\n}\n`;\n\n if (config.grammarEnabled) {\n code += `\n/**\n * Translate hyperscript between languages.\n *\n * Returns the input UNCHANGED when it cannot be parsed in \\`fromLang\\`, or when\n * \\`toLang\\` is not one of the languages this bundle registered. The semantic\n * translator throws in both cases; returning the source is the honest degradation.\n */\nfunction translateHyperscript(code, fromLang, toLang) {\n try {\n return translate(code, fromLang, toLang);\n } catch {\n return code;\n }\n}\n`;\n }\n\n return code;\n}\n\n/**\n * The names the generated bundle attaches to its `api` when semantic is enabled.\n */\nexport function getSemanticExports(config: SemanticConfig): string[] {\n const exports: string[] = [];\n\n if (config.enabled) {\n exports.push('translateSource');\n exports.push('SUPPORTED_SEMANTIC_LANGUAGES');\n }\n\n if (config.grammarEnabled) {\n exports.push('translateHyperscript');\n }\n\n return exports;\n}\n","/**\n * Generator\n *\n * Emits the virtual `hyperfixi` module: a bundle on `@hyperfixi/engine` that\n * registers only the grammar modules the scanned project needs. A bundle on the\n * engine IS the list passed to `register()`, so there is one tier: the modules.\n * (Until 4.0 the generator embedded one of core's three parsers — regex \"lite\",\n * the hybrid AST parser, or a fallback to the full `hyperfixi.js` — each with its\n * own semantics; measured 2026-10-03: lite 3.9–4.5 KB, hybrid 12.3–16.1 KB, the\n * fallback 352 KB, which any use of `fetch` reached. On the engine the same\n * usages are 17–20 KB and `everything` is 34 KB, all with upstream's grammar.)\n *\n * Multilingual: text is the interchange. When semantic parsing is enabled the\n * bundle translates a non-English script to English as the engine reads it\n * (`api.addSourceTransform`); the attribute stays as written.\n */\n\nimport type { AggregatedUsage, HyperfixiPluginOptions } from './types';\nimport { resolveModules, type ModuleUsage } from './engine-modules';\nimport {\n resolveSemanticConfig,\n generateSemanticIntegrationCode,\n getSemanticExports,\n getSemanticBundleSize,\n type SemanticConfig,\n} from './semantic-integration';\n\n// =============================================================================\n// BUNDLE GENERATOR\n// =============================================================================\n\ninterface BundleSpec {\n name: string;\n /** Engine module export names, in registration order. */\n modules: string[];\n /** For the header and `api.bundle`: what the scan saw. */\n commands: string[];\n blocks: string[];\n positional: boolean;\n reactivity: boolean;\n /** Re-process content htmx swaps in (`htmx:load` / `htmx:afterSettle`). */\n htmxIntegration: boolean;\n globalName: string;\n autoInit: boolean;\n esModule: boolean;\n semantic: SemanticConfig;\n}\n\nconst ENGINE_API_NAMES = ['api', 'boot', 'register'];\n\n/**\n * Generate the bundle source from a spec.\n */\nfunction generateBundleCode(spec: BundleSpec): string {\n const {\n name,\n modules,\n commands,\n blocks,\n positional,\n reactivity,\n htmxIntegration,\n globalName,\n autoInit,\n esModule,\n semantic,\n } = spec;\n\n const semanticCode = generateSemanticIntegrationCode(semantic);\n const semanticExports = getSemanticExports(semantic);\n const languages = semantic.enabled ? [...semantic.languages].sort() : [];\n\n const headerLines = [\n `Modules: ${modules.join(', ')}`,\n commands.length > 0 ? `Commands: ${commands.join(', ')}` : '',\n blocks.length > 0 ? `Blocks: ${blocks.join(', ')}` : '',\n positional ? 'Expressions: positional / collection (expressionsExtra)' : '',\n reactivity ? 'Reactivity: live / when / bind' : '',\n semantic.enabled\n ? `Multilingual: ${languages.join(', ') || 'en'} (translated as read, through the engine's source transform)`\n : '',\n htmxIntegration ? 'htmx: content swapped in is processed (htmx:load / htmx:afterSettle)' : '',\n ].filter(Boolean);\n\n const bundleInfo = JSON.stringify({\n generator: '@hyperfixi/vite-plugin',\n modules,\n commands,\n blocks,\n languages,\n });\n\n const apiProps = [`bundle: ${bundleInfo}`, ...semanticExports].map(p => ` ${p},`).join('\\n');\n\n // `boot()` installs `window._hyperscript` (the engine is a _hyperscript\n // implementation; that global is its to take) and processes the document.\n // The plugin's own global is set beside it unless the two names coincide.\n const installGlobal = globalName === '_hyperscript' ? '' : ` window.${globalName} = api;\\n`;\n\n const htmxHooks = htmxIntegration\n ? `\n // htmx (any major) announces swapped-in content on these; hand it to the engine.\n for (const type of ['htmx:load', 'htmx:afterSettle']) {\n document.addEventListener(type, event => {\n const detail = event.detail;\n const target = (detail && (detail.elt || detail.target)) || event.target;\n if (target instanceof Element) api.processNode(target);\n });\n }\n`\n : '';\n\n return `/**\n * hyperfixi ${name} bundle (auto-generated)\n *\n * Generated by: @hyperfixi/vite-plugin\n * Engine: @hyperfixi/engine — the grammar is exactly the modules registered below.\n${headerLines.map(l => ` * ${l}`).join('\\n')}\n *\n * DO NOT EDIT - This file is automatically regenerated.\n */\n\nimport { ${[...ENGINE_API_NAMES, ...modules].join(', ')} } from '@hyperfixi/engine';\n${semanticCode}\nregister(${modules.join(', ')});\n${semantic.enabled ? 'api.addSourceTransform(translateSource);\\n' : ''}\nObject.assign(api, {\n${apiProps}\n});\n${\n autoInit\n ? `\nif (typeof window !== 'undefined') {\n${installGlobal} boot();\n${htmxHooks}}\n`\n : ''\n}${\n esModule\n ? `\nexport default api;\nexport { api };\n`\n : ''\n }`;\n}\n\n// =============================================================================\n// GENERATOR CLASS\n// =============================================================================\n\n/**\n * Generator class for creating module-list bundles on the engine\n */\nexport class Generator {\n private debug: boolean;\n\n constructor(options: Pick<HyperfixiPluginOptions, 'debug'>) {\n this.debug = options.debug ?? false;\n }\n\n /**\n * Generate bundle code from aggregated usage\n */\n generate(usage: AggregatedUsage, options: HyperfixiPluginOptions): string {\n const commands = [...new Set([...usage.commands, ...(options.extraCommands ?? [])])];\n const blocks = [...new Set([...usage.blocks, ...(options.extraBlocks ?? [])])];\n const positional = usage.positional || options.positional || false;\n const reactivity = Boolean(\n usage.needsReactivity || usage.needsBindToProperty || usage.htmx?.needsReactivity\n );\n\n // Resolve semantic configuration\n const semantic = resolveSemanticConfig(options, usage.detectedLanguages);\n\n // If no usage detected and no semantic, return empty module\n if (\n commands.length === 0 &&\n blocks.length === 0 &&\n !positional &&\n !reactivity &&\n !semantic.enabled\n ) {\n return this.generateEmptyBundle(options);\n }\n\n const moduleUsage: ModuleUsage = {\n commands,\n blocks,\n positional,\n reactivity,\n construct: usage.needsConstruct,\n cookies: usage.needsCookies,\n };\n const { modules, unknown } = resolveModules(moduleUsage);\n\n if (this.debug) {\n if (unknown.length > 0) {\n console.log(\n `[hyperfixi] Scanned names with no engine module (a form the engine dropped, or a false positive): ${unknown.join(', ')}`\n );\n }\n if (usage.htmx?.needsHxLive || usage.htmx?.needsSSE || usage.htmx?.needsWS) {\n console.log(\n '[hyperfixi] hx-live / sse-* / ws-* attributes seen: these are htmx 4 features on the engine ' +\n '(load htmx 4 beside this bundle; a hyperscript-bodied hx-live is a `live … end` block).'\n );\n }\n const bundleInfo: Record<string, unknown> = {\n modules,\n commands,\n blocks,\n positional,\n reactivity,\n };\n if (semantic.enabled && semantic.bundleType) {\n const sizeInfo = getSemanticBundleSize(semantic.bundleType);\n bundleInfo.semanticBundle = semantic.bundleType;\n bundleInfo.semanticSize = sizeInfo.gzip;\n bundleInfo.languages = [...semantic.languages];\n bundleInfo.grammar = semantic.grammarEnabled;\n }\n console.log('[hyperfixi] Generating bundle:', bundleInfo);\n if (semantic.bundleType === 'all' || semantic.bundleType === 'priority') {\n console.log(\n `[hyperfixi] Note: Using '${semantic.bundleType}' semantic bundle (${getSemanticBundleSize(semantic.bundleType).gzip}). ` +\n `Consider using 'region' option to select a smaller regional bundle if all languages aren't needed.`\n );\n }\n }\n\n return generateBundleCode({\n name: options.bundleName ?? 'ViteAutoGenerated',\n modules,\n commands,\n blocks,\n positional,\n reactivity,\n htmxIntegration: options.htmx ?? usage.htmx?.hasHtmxAttributes ?? false,\n globalName: options.globalName ?? 'hyperfixi',\n autoInit: true,\n esModule: true,\n semantic,\n });\n }\n\n /**\n * Generate an empty bundle when no hyperscript is detected\n */\n private generateEmptyBundle(options: HyperfixiPluginOptions): string {\n const globalName = options.globalName ?? 'hyperfixi';\n\n return `/**\n * hyperfixi Empty Bundle (Auto-Generated)\n *\n * No hyperscript usage detected. This bundle provides a minimal API.\n * Add hyperscript attributes (_=\"...\") to your HTML to enable features.\n *\n * Generated by: @hyperfixi/vite-plugin\n */\n\nconst api = {\n version: '1.0.0-empty',\n bundle: { generator: '@hyperfixi/vite-plugin', modules: [], commands: [], blocks: [], languages: [] },\n\n parse() {\n console.warn('hyperfixi: No engine loaded. Add hyperscript to your HTML to enable parsing.');\n return { errors: [] };\n },\n\n async evaluate(code, element) {\n console.warn('hyperfixi: No modules loaded. Detected commands will be automatically included.');\n return null;\n },\n\n processNode() {},\n process() {},\n};\n\nif (typeof window !== 'undefined') {\n window.${globalName} = api;\n}\n\nexport default api;\nexport { api };\n`;\n }\n\n /**\n * Generate a development fallback bundle: the engine with every module.\n *\n * One shape serves every former fallback (`hybrid-complete`, `full`, `hx-v4`):\n * the engine's `everything` is 34 KB gzipped and carries the reactive features\n * (`live`, `when`, `bind`) the hx-v4 fallback existed for. The argument is kept\n * for the option's type; its value no longer changes the output.\n */\n generateDevFallback(\n _fallback: 'hybrid-complete' | 'full' | 'hx-v4' | 'everything' = 'everything'\n ): string {\n return `/**\n * hyperfixi Dev Fallback Bundle\n *\n * The engine with every module, for faster development rebuilds.\n * Production builds register only the modules the project uses.\n *\n * Generated by: @hyperfixi/vite-plugin\n */\n\nimport { api, boot, register, everything } from '@hyperfixi/engine';\n\nregister(...everything);\nObject.assign(api, {\n bundle: { generator: '@hyperfixi/vite-plugin', modules: ['everything'], commands: [], blocks: [], languages: [] },\n});\n\nif (typeof window !== 'undefined') {\n window.hyperfixi = api;\n boot();\n}\n\nexport default api;\nexport { api };\n`;\n }\n}\n","import { resolve, join } from 'node:path';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport type { ServerBridgeOptions } from './types.js';\n\n/** Dynamically-loaded server-bridge module shape */\ninterface ServerBridgeModule {\n generate: (options: {\n dir: string;\n framework?: string;\n output?: string;\n typescript?: boolean;\n ignore?: string[];\n }) => Promise<{\n scan: { routes: Array<{ method: string; path: string }>; conflicts: unknown[] };\n generated: { files: Array<{ path: string; content: string }> };\n routes: Array<{ method: string; path: string }>;\n }>;\n createManifest: (routes: unknown[]) => unknown;\n saveManifest: (dir: string, manifest: unknown) => Promise<void>;\n}\n\nlet serverBridge: ServerBridgeModule | null = null;\nlet loadAttempted = false;\nlet lastRouteHash = '';\n\n/**\n * Attempt to lazy-load @hyperfixi/server-bridge.\n * Returns null with a warning if not installed.\n */\nexport async function loadServerBridge(debug?: boolean): Promise<ServerBridgeModule | null> {\n if (loadAttempted) return serverBridge;\n loadAttempted = true;\n\n try {\n const mod = await import('@hyperfixi/server-bridge');\n serverBridge = mod as unknown as ServerBridgeModule;\n if (debug) {\n console.log('[hyperfixi] Server-bridge loaded successfully');\n }\n return serverBridge;\n } catch {\n console.warn(\n '[hyperfixi] @hyperfixi/server-bridge is not installed. ' +\n 'Install it to enable server route generation: npm install @hyperfixi/server-bridge'\n );\n return null;\n }\n}\n\n/**\n * Compute a hash of routes for change detection.\n */\nfunction computeRouteHash(routes: Array<{ method: string; path: string }>): string {\n return routes\n .map(r => `${r.method}:${r.path}`)\n .sort()\n .join('|');\n}\n\n/**\n * Run a full server-bridge scan + generate cycle.\n * Skips generation if routes haven't changed (hash-based).\n */\nexport async function runServerBridge(\n cwd: string,\n options: ServerBridgeOptions,\n debug?: boolean,\n force?: boolean\n): Promise<void> {\n const mod = serverBridge ?? (await loadServerBridge(debug));\n if (!mod) return;\n\n try {\n const outputDir = resolve(cwd, options.output ?? './server/routes');\n\n const result = await mod.generate({\n dir: cwd,\n framework: options.framework ?? 'express',\n output: options.output,\n typescript: options.typescript,\n ignore: options.ignore,\n });\n\n // Skip writing if routes haven't changed\n const routeHash = computeRouteHash(result.routes);\n if (!force && routeHash === lastRouteHash) {\n if (debug) {\n console.log('[hyperfixi] Server-bridge: routes unchanged, skipping generation');\n }\n return;\n }\n lastRouteHash = routeHash;\n\n if (result.routes.length === 0) {\n if (debug) {\n console.log('[hyperfixi] Server-bridge: no routes found');\n }\n return;\n }\n\n // Write generated files\n await mkdir(outputDir, { recursive: true });\n for (const file of result.generated.files) {\n const filePath = join(outputDir, file.path);\n const fileDir = join(filePath, '..');\n await mkdir(fileDir, { recursive: true });\n await writeFile(filePath, file.content, 'utf-8');\n }\n\n // Save manifest\n const manifest = mod.createManifest(result.routes);\n await mod.saveManifest(outputDir, manifest);\n\n if (debug) {\n console.log(\n `[hyperfixi] Server-bridge: generated ${result.generated.files.length} file(s) ` +\n `for ${result.routes.length} route(s) in ${outputDir}/`\n );\n }\n\n if (result.scan.conflicts.length > 0) {\n console.warn(\n `[hyperfixi] Server-bridge: ${result.scan.conflicts.length} route conflict(s) detected`\n );\n }\n } catch (err) {\n console.error(\n '[hyperfixi] Server-bridge generation failed:',\n err instanceof Error ? err.message : err\n );\n }\n}\n\n/**\n * Reset cached state (for testing).\n */\nexport function resetServerBridgeState(): void {\n serverBridge = null;\n loadAttempted = false;\n lastRouteHash = '';\n}\n\n// Export for testing\nexport { computeRouteHash as _computeRouteHash };\n","/**\n * Domain Scanner for Vite Plugin\n *\n * Scans source files for domain-specific DSL usage based on configurable\n * attribute patterns and keyword sets. Runs alongside the existing\n * hyperscript Scanner as an opt-in feature.\n */\n\nimport type { DomainScanRule, DomainFileUsage } from './types';\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Build regex patterns for extracting attribute values.\n */\nfunction buildAttributePatterns(attributes: readonly string[]): RegExp[] {\n const patterns: RegExp[] = [];\n for (const attr of attributes) {\n const escaped = attr.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n patterns.push(new RegExp(`${escaped}\\\\s*=\\\\s*\"([^\"]+)\"`, 'g'));\n patterns.push(new RegExp(`${escaped}\\\\s*=\\\\s*'([^']+)'`, 'g'));\n patterns.push(new RegExp(`${escaped}\\\\s*=\\\\s*\\`([^\\`]+)\\``, 'g'));\n }\n return patterns;\n}\n\n/**\n * Build regex patterns for extracting script tag contents.\n */\nfunction buildScriptPatterns(scriptTypes: readonly string[]): RegExp[] {\n return scriptTypes.map(type => {\n const escaped = type.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`<script[^>]*type=[\"']?${escaped}[\"']?[^>]*>([\\\\s\\\\S]*?)<\\\\/script>`, 'gi');\n });\n}\n\n/**\n * Detect keywords in a snippet.\n */\nfunction detectKeywords(\n snippet: string,\n keywords: Readonly<Record<string, readonly string[]>>\n): { detectedKeywords: Set<string>; detectedLanguages: Set<string> } {\n const detectedKeywords = new Set<string>();\n const detectedLanguages = new Set<string>();\n\n for (const [lang, kwList] of Object.entries(keywords)) {\n for (const kw of kwList) {\n // Use word boundary for Latin characters, simple includes for non-Latin\n const isLatin = /^[a-zA-Z]/.test(kw);\n const found = isLatin\n ? new RegExp(`\\\\b${kw.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i').test(snippet)\n : snippet.includes(kw);\n\n if (found) {\n detectedKeywords.add(kw);\n detectedLanguages.add(lang);\n }\n }\n }\n\n return { detectedKeywords, detectedLanguages };\n}\n\n// =============================================================================\n// DomainScanner\n// =============================================================================\n\n/**\n * Scanner that detects domain-specific syntax in source files.\n * Complements the existing hyperscript Scanner.\n */\nexport class DomainScanner {\n private rules: readonly DomainScanRule[];\n /** Pre-compiled regex for fast hasAnyDomainUsage check */\n private quickCheckPattern: RegExp | null;\n\n constructor(rules: readonly DomainScanRule[]) {\n this.rules = rules;\n\n // Build a quick-check regex from all attribute names\n const allAttrs = rules.flatMap(r => [...r.attributes]);\n const allScriptTypes = rules.flatMap(r => (r.scriptTypes ? [...r.scriptTypes] : []));\n const parts: string[] = [];\n\n for (const attr of allAttrs) {\n parts.push(attr.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n }\n for (const type of allScriptTypes) {\n parts.push(type.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n }\n\n this.quickCheckPattern = parts.length > 0 ? new RegExp(parts.join('|'), 'i') : null;\n }\n\n /**\n * Fast pre-check: does this code contain any domain-related attributes?\n */\n hasAnyDomainUsage(code: string): boolean {\n if (!this.quickCheckPattern) return false;\n return this.quickCheckPattern.test(code);\n }\n\n /**\n * Scan a file for all registered domain syntaxes.\n * Returns one DomainFileUsage per domain that had matches.\n */\n scan(code: string, _id: string): DomainFileUsage[] {\n const results: DomainFileUsage[] = [];\n\n for (const rule of this.rules) {\n const snippets: string[] = [];\n\n // Extract from attributes\n const attrPatterns = buildAttributePatterns(rule.attributes);\n for (const pattern of attrPatterns) {\n pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(code))) {\n const value = match[1].trim();\n if (value) snippets.push(value);\n }\n }\n\n // Extract from script tags\n if (rule.scriptTypes) {\n const scriptPatterns = buildScriptPatterns(rule.scriptTypes);\n for (const pattern of scriptPatterns) {\n pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(code))) {\n const value = match[1].trim();\n if (value) snippets.push(value);\n }\n }\n }\n\n if (snippets.length === 0) continue;\n\n // Detect keywords in extracted snippets\n const allDetectedKeywords = new Set<string>();\n const allDetectedLanguages = new Set<string>();\n\n if (rule.keywords) {\n for (const snippet of snippets) {\n const { detectedKeywords, detectedLanguages } = detectKeywords(snippet, rule.keywords);\n for (const kw of detectedKeywords) allDetectedKeywords.add(kw);\n for (const lang of detectedLanguages) allDetectedLanguages.add(lang);\n }\n }\n\n results.push({\n domain: rule.domain,\n detectedKeywords: allDetectedKeywords,\n detectedLanguages: allDetectedLanguages,\n snippetCount: snippets.length,\n });\n }\n\n return results;\n }\n}\n\n// =============================================================================\n// Helper: Convert DomainDescriptor.scanConfig to DomainScanRule\n// =============================================================================\n\n/**\n * Convert a DomainDescriptor's scanConfig to a DomainScanRule.\n * Returns null if the descriptor has no scanConfig.\n *\n * This allows DomainDescriptors from the framework to be used\n * directly with the Vite plugin scanner.\n */\nexport function descriptorToScanRule(descriptor: {\n name: string;\n scanConfig?: {\n attributes: readonly string[];\n scriptTypes?: readonly string[];\n keywords?: Readonly<Record<string, readonly string[]>>;\n };\n}): DomainScanRule | null {\n if (!descriptor.scanConfig) return null;\n return {\n domain: descriptor.name,\n attributes: [...descriptor.scanConfig.attributes],\n scriptTypes: descriptor.scanConfig.scriptTypes\n ? [...descriptor.scanConfig.scriptTypes]\n : undefined,\n keywords: descriptor.scanConfig.keywords\n ? Object.fromEntries(\n Object.entries(descriptor.scanConfig.keywords).map(([k, v]) => [k, [...v]])\n )\n : undefined,\n };\n}\n","/**\n * Domain Aggregator\n *\n * Aggregates per-domain usage across files, following the same\n * pattern as the existing hyperscript Aggregator.\n */\n\nimport type { DomainFileUsage, DomainAggregatedUsage } from './types';\n\n/**\n * Aggregates domain usage across multiple files.\n */\nexport class DomainAggregator {\n private fileUsage = new Map<string, DomainFileUsage[]>();\n private cache: DomainAggregatedUsage[] | null = null;\n\n /**\n * Add or update domain usage for a file.\n * Returns true if usage changed (invalidates cache).\n */\n add(filePath: string, usage: DomainFileUsage[]): boolean {\n const existing = this.fileUsage.get(filePath);\n const changed = !existing || !this.isEqual(existing, usage);\n\n if (changed) {\n this.fileUsage.set(filePath, usage);\n this.cache = null;\n }\n\n return changed;\n }\n\n /**\n * Remove a file's domain usage.\n * Returns true if the file was tracked.\n */\n remove(filePath: string): boolean {\n const had = this.fileUsage.has(filePath);\n if (had) {\n this.fileUsage.delete(filePath);\n this.cache = null;\n }\n return had;\n }\n\n /**\n * Get aggregated usage across all files.\n * Result is cached until add/remove changes it.\n */\n getUsage(): DomainAggregatedUsage[] {\n if (this.cache) return this.cache;\n\n const domainMap = new Map<\n string,\n {\n detectedKeywords: Set<string>;\n detectedLanguages: Set<string>;\n fileCount: number;\n totalSnippets: number;\n }\n >();\n\n for (const usages of this.fileUsage.values()) {\n for (const usage of usages) {\n let entry = domainMap.get(usage.domain);\n if (!entry) {\n entry = {\n detectedKeywords: new Set(),\n detectedLanguages: new Set(),\n fileCount: 0,\n totalSnippets: 0,\n };\n domainMap.set(usage.domain, entry);\n }\n\n entry.fileCount++;\n entry.totalSnippets += usage.snippetCount;\n for (const kw of usage.detectedKeywords) entry.detectedKeywords.add(kw);\n for (const lang of usage.detectedLanguages) entry.detectedLanguages.add(lang);\n }\n }\n\n this.cache = Array.from(domainMap.entries()).map(([domain, data]) => ({\n domain,\n detectedKeywords: data.detectedKeywords,\n detectedLanguages: data.detectedLanguages,\n fileCount: data.fileCount,\n totalSnippets: data.totalSnippets,\n }));\n\n return this.cache;\n }\n\n /**\n * Get aggregated usage for a specific domain.\n */\n getUsageForDomain(domain: string): DomainAggregatedUsage | null {\n return this.getUsage().find(u => u.domain === domain) ?? null;\n }\n\n /**\n * Clear all tracked data.\n */\n clear(): void {\n this.fileUsage.clear();\n this.cache = null;\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private isEqual(a: DomainFileUsage[], b: DomainFileUsage[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].domain !== b[i].domain) return false;\n if (a[i].snippetCount !== b[i].snippetCount) return false;\n if (a[i].detectedKeywords.size !== b[i].detectedKeywords.size) return false;\n }\n return true;\n }\n}\n","/**\n * @hyperfixi/vite-plugin\n *\n * Zero-config Vite plugin that automatically generates minimal HyperFixi bundles\n * based on detected hyperscript usage in your source files.\n *\n * @example\n * ```javascript\n * // vite.config.js\n * import { hyperfixi } from '@hyperfixi/vite-plugin';\n *\n * export default {\n * plugins: [hyperfixi()]\n * };\n * ```\n *\n * The plugin automatically:\n * - Scans HTML, Vue, Svelte, JSX/TSX files for `_=\"...\"` attributes\n * - Detects which commands, blocks, and expressions are used\n * - Generates a minimal bundle with only needed features\n * - Re-generates on file changes (HMR)\n *\n * @example\n * ```javascript\n * // With options\n * hyperfixi({\n * extraCommands: ['fetch', 'put'], // Always include these commands\n * htmx: true, // Enable htmx integration\n * debug: true, // Enable verbose logging\n * })\n * ```\n *\n */\n\nimport type { Plugin, ResolvedConfig, ViteDevServer, HmrContext } from 'vite';\nimport type { HyperfixiPluginOptions, AggregatedUsage } from './types';\nimport { Scanner } from './scanner';\nimport { Aggregator } from './aggregator';\nimport { Generator } from './generator';\nimport { loadServerBridge, runServerBridge } from './server-bridge-integration';\nimport { DomainScanner } from './domain-scanner';\nimport { DomainAggregator } from './domain-aggregator';\n\n// Re-export types\nexport type {\n HyperfixiPluginOptions,\n FileUsage,\n AggregatedUsage,\n CustomLanguageKeywords,\n ServerBridgeOptions,\n DomainScanRule,\n DomainFileUsage,\n DomainAggregatedUsage,\n} from './types';\n\n// Domain scanning (multi-domain support)\nexport { DomainScanner, descriptorToScanRule } from './domain-scanner';\nexport { DomainAggregator } from './domain-aggregator';\n\n// Re-export language keyword utilities for customization\nexport {\n SUPPORTED_LANGUAGES,\n REGIONS,\n registerCustomKeywords,\n getKeywordsForLanguage,\n isNonLatinLanguage,\n getAllLanguageCodes,\n clearCustomKeywords,\n detectLanguages,\n getOptimalRegion,\n} from './language-keywords';\nexport type { SupportedLanguage } from './language-keywords';\n\n// Virtual module ID\nconst VIRTUAL_MODULE_ID = 'virtual:hyperfixi';\nconst RESOLVED_VIRTUAL_MODULE_ID = '\\0' + VIRTUAL_MODULE_ID;\n\n/**\n * Import aliases that resolve to the virtual module.\n *\n * `lokascript` is here for a reason beyond brand symmetry: the docs consistently\n * show `import 'lokascript'` for the plugin flow, and neither `lokascript` nor\n * `hyperfixi` is a published npm package. Because `resolveId` runs BEFORE\n * node_modules resolution, any specifier listed here is intercepted and can\n * never fall through. Any specifier NOT listed here falls through — so an\n * unlisted `lokascript` failed to resolve outright, and would silently resolve\n * to a full ~300 KB package the day someone publishes that name, defeating the\n * entire point of the plugin's generated ~8 KB bundle. Listing it closes both.\n */\nconst IMPORT_ALIASES = ['hyperfixi', 'lokascript', '@hyperfixi/core', 'virtual:hyperfixi'];\n\n/**\n * Compute a hash of the current usage for dev-server cache invalidation.\n *\n * Every input that influences bundle SELECTION must be part of this hash.\n * The htmx/reactivity flags decide which engine modules are registered; before\n * they were hashed, adding or removing an hx-live/sse-connect/ws-send\n * attribute — without touching any command/block/language — left the cached\n * dev bundle stale. Exported for tests.\n */\nexport function computeUsageHash(usage: AggregatedUsage): string {\n const commands = [...usage.commands].sort().join(',');\n const blocks = [...usage.blocks].sort().join(',');\n const languages = [...usage.detectedLanguages].sort().join(',');\n const htmx = usage.htmx\n ? [\n usage.htmx.hasHtmxAttributes,\n usage.htmx.hasFixiAttributes,\n usage.htmx.needsHxLive,\n usage.htmx.needsSSE,\n usage.htmx.needsWS,\n usage.htmx.needsBindToProperty,\n usage.htmx.needsReactivity,\n ]\n .map(f => (f ? '1' : '0'))\n .join('')\n : 'none';\n const reactivity = `${usage.needsReactivity ? 1 : 0}${usage.needsBindToProperty ? 1 : 0}`;\n const extras = `${usage.needsConstruct ? 1 : 0}${usage.needsCookies ? 1 : 0}`;\n return `${commands}|${blocks}|${usage.positional}|${languages}|${htmx}|${reactivity}|${extras}`;\n}\n\n/**\n * Create the HyperFixi Vite plugin\n *\n * @param options Plugin options\n * @returns Vite plugin\n */\nexport function hyperfixi(options: HyperfixiPluginOptions = {}): Plugin {\n if (options.mode === 'compile') {\n // Compile mode pre-compiled handlers with @hyperfixi/core's hybrid parser. It was\n // parked with the AOT work (owner decision 2026-10-03) and removed in Phase C4, with\n // core's parser; the engine-module bundle is the product.\n console.warn(\n '[hyperfixi] mode: \"compile\" was removed in 4.0 (it compiled with @hyperfixi/core\\'s ' +\n 'parser); building the bundle on @hyperfixi/engine instead.'\n );\n }\n const scanner = new Scanner(options);\n const aggregator = new Aggregator();\n const generator = new Generator(options);\n\n // Domain scanning (multi-domain support)\n const domainScanner =\n options.domains && options.domains.length > 0 ? new DomainScanner(options.domains) : null;\n const domainAggregator = domainScanner ? new DomainAggregator() : null;\n\n let server: ViteDevServer | null = null;\n let cachedBundle: string | null = null;\n let lastUsageHash = '';\n let isDev = false;\n\n /**\n * Invalidate the virtual module in dev server\n */\n function invalidateVirtualModule(): void {\n if (!server) return;\n\n const mod = server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);\n if (mod) {\n server.moduleGraph.invalidateModule(mod);\n server.ws.send({ type: 'full-reload' });\n\n if (options.debug) {\n console.log('[hyperfixi] Virtual module invalidated, triggering reload');\n }\n }\n }\n\n /**\n * Generate the bundle code (interpret mode)\n */\n function generateInterpretBundle(): string {\n const usage = aggregator.getUsage();\n const usageHash = computeUsageHash(usage);\n\n // Return cached bundle if usage hasn't changed\n if (cachedBundle && usageHash === lastUsageHash) {\n return cachedBundle;\n }\n\n // In dev mode, optionally use fallback bundle for faster rebuilds\n if (isDev && options.devFallback && options.devFallback !== 'auto') {\n cachedBundle = generator.generateDevFallback(options.devFallback);\n } else {\n cachedBundle = generator.generate(usage, options);\n }\n\n lastUsageHash = usageHash;\n\n if (options.debug) {\n const summary = aggregator.getSummary();\n console.log('[hyperfixi] Bundle generated:', summary);\n }\n\n return cachedBundle;\n }\n\n /** The bundle: the engine modules the scanned usage needs. */\n function generateBundle(): string {\n return generateInterpretBundle();\n }\n\n return {\n name: 'vite-plugin-hyperfixi',\n enforce: 'pre' as const,\n\n /**\n * Configure plugin based on Vite mode\n */\n async configResolved(config: ResolvedConfig) {\n isDev = config.command === 'serve';\n\n if (options.debug) {\n console.log('[hyperfixi] Plugin initialized, mode:', isDev ? 'development' : 'production');\n }\n\n // Lazy-load server-bridge if configured\n if (options.serverBridge) {\n await loadServerBridge(options.debug);\n }\n },\n\n /**\n * Store server reference and pre-scan HTML files for HMR\n */\n async configureServer(_server: ViteDevServer) {\n server = _server;\n\n // Pre-scan project to detect hyperscript before first request\n const cwd = _server.config.root;\n if (options.debug) {\n console.log('[hyperfixi] Pre-scanning project:', cwd);\n }\n\n const scannedFiles = await scanner.scanProject(cwd);\n aggregator.loadFromScan(scannedFiles);\n\n // Domain scanning (if configured)\n if (domainScanner && domainAggregator) {\n for (const [filePath] of scannedFiles) {\n // Re-read file content for domain scanning\n try {\n const fs = await import('fs');\n const content = fs.readFileSync(filePath, 'utf-8');\n if (domainScanner.hasAnyDomainUsage(content)) {\n const domainUsages = domainScanner.scan(content, filePath);\n if (domainUsages.length > 0) {\n domainAggregator.add(filePath, domainUsages);\n }\n }\n } catch {\n // File may have been deleted between scan and domain scan\n }\n }\n\n if (options.debug) {\n const domainSummary = domainAggregator.getUsage();\n console.log('[hyperfixi] Domain pre-scan:', domainSummary);\n }\n }\n\n if (options.debug) {\n const summary = aggregator.getSummary();\n console.log('[hyperfixi] Pre-scan complete:', summary);\n }\n },\n\n /**\n * Resolve virtual module imports\n */\n resolveId(id: string) {\n if (IMPORT_ALIASES.includes(id)) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n return null;\n },\n\n /**\n * Load the virtual module with generated bundle\n */\n load(id: string) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n return generateBundle();\n }\n return null;\n },\n\n /**\n * Scan files during transform for hyperscript usage\n */\n transform(code: string, id: string) {\n if (!scanner.shouldScan(id)) {\n return null;\n }\n\n // Scan for usage\n const usage = scanner.scan(code, id);\n const changed = aggregator.add(id, usage);\n\n // Domain scanning (detection only)\n if (domainScanner && domainAggregator && domainScanner.hasAnyDomainUsage(code)) {\n const domainUsages = domainScanner.scan(code, id);\n if (domainUsages.length > 0) {\n domainAggregator.add(id, domainUsages);\n }\n }\n\n // Invalidate virtual module if usage changed\n if (changed && server) {\n // Debounce invalidation slightly to batch multiple file changes\n setImmediate(() => {\n const currentHash = computeUsageHash(aggregator.getUsage());\n if (currentHash !== lastUsageHash) {\n invalidateVirtualModule();\n }\n });\n }\n\n return null; // Source files are never modified\n },\n\n /**\n * Handle file changes in HMR\n */\n async handleHotUpdate(ctx: HmrContext) {\n const { file, read } = ctx;\n\n // Check if a scanned file was changed\n if (scanner.shouldScan(file)) {\n try {\n // Read the updated file content and re-scan\n const content = await read();\n const usage = scanner.scan(content, file);\n const changed = aggregator.add(file, usage);\n\n if (options.debug) {\n console.log('[hyperfixi] HMR: Re-scanned', file.split('/').pop(), usage);\n }\n\n // Invalidate virtual module if usage changed\n if (changed) {\n const currentHash = computeUsageHash(aggregator.getUsage());\n if (currentHash !== lastUsageHash) {\n invalidateVirtualModule();\n }\n }\n\n // Re-generate server routes on HTML file changes (hash-based skip if unchanged)\n if (options.serverBridge && server) {\n await runServerBridge(server.config.root, options.serverBridge, options.debug);\n }\n } catch {\n // File was deleted, remove from aggregator\n if (aggregator.remove(file)) {\n invalidateVirtualModule();\n }\n }\n }\n\n return undefined;\n },\n\n /**\n * Scan entire project before production build\n */\n async buildStart() {\n if (!isDev) {\n // Production build: scan entire project\n const cwd = process.cwd();\n\n if (options.debug) {\n console.log('[hyperfixi] Scanning project for hyperscript usage...');\n }\n\n const scannedFiles = await scanner.scanProject(cwd);\n aggregator.loadFromScan(scannedFiles);\n\n // Domain scanning (if configured)\n if (domainScanner && domainAggregator) {\n for (const [filePath] of scannedFiles) {\n try {\n const fs = await import('fs');\n const content = fs.readFileSync(filePath, 'utf-8');\n if (domainScanner.hasAnyDomainUsage(content)) {\n const domainUsages = domainScanner.scan(content, filePath);\n if (domainUsages.length > 0) {\n domainAggregator.add(filePath, domainUsages);\n }\n }\n } catch {\n // File may have been deleted\n }\n }\n\n if (options.debug) {\n const domainSummary = domainAggregator.getUsage();\n console.log('[hyperfixi] Domain build scan:', domainSummary);\n }\n }\n\n if (options.debug) {\n const summary = aggregator.getSummary();\n console.log(`[hyperfixi] Found ${summary.fileCount} files with hyperscript:`, {\n commands: summary.commands,\n blocks: summary.blocks,\n positional: summary.positional,\n languages: summary.languages,\n });\n }\n\n // Server-bridge: full scan + generate on production build\n if (options.serverBridge) {\n await runServerBridge(cwd, options.serverBridge, options.debug, true);\n }\n }\n },\n } as Plugin;\n}\n\n// Default export for convenience\nexport default hyperfixi;\n"],"mappings":";AAeA,YAAY,YAAY;AACxB,SAAS,eAAe,kBAA+B;AAWvD,SAAS,aAAa,KAAqB;AACzC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,QAAI,UAAU,IAAK,QAAO;AAAA,EAC5B;AACA,QAAM,IAAI,MAAM,oEAAoE;AACtF;AAGO,IAAM,iBAA8C,WAAW,IAAI,SAAO;AAC/E,QAAM,UAAU,cAAc;AAC9B,MAAI,OAAO;AACX,SAAO;AAAA,IACL,MAAM,aAAa,GAAG;AAAA;AAAA;AAAA,IAGtB,UAAU,OAAO,KAAK,QAAQ,QAAQ,EAAE,OAAO,OAAK,WAAW,KAAK,CAAC,CAAC;AAAA,IACtE,UAAU,OAAO,KAAK,QAAQ,QAAQ;AAAA,EACxC;AACF,CAAC;AAED,IAAM,SAAS,IAAI,IAAI,eAAe,IAAI,OAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAGpD,IAAM,mBAAgD,IAAI;AAAA,EAC/D,eAAe,QAAQ,OAAK,EAAE,SAAS,IAAI,OAAK,CAAC,GAAG,EAAE,IAAI,CAAU,CAAC;AACvE;AAGO,IAAM,mBAAgD,IAAI;AAAA,EAC/D,eAAe,QAAQ,OAAK,EAAE,SAAS,IAAI,OAAK,CAAC,GAAG,EAAE,IAAI,CAAU,CAAC;AACvE;AAQA,IAAM,cAAc,oBAAI,IAAI,CAAC,MAAM,MAAM,QAAQ,QAAQ,MAAM,CAAC;AACzD,IAAM,qBAAwC;AAAA,EACnD,GAAG,oBAAI,IAAI,CAAC,GAAG,iBAAiB,KAAK,GAAG,GAAG,iBAAiB,KAAK,CAAC,CAAC;AACrE,EACG,OAAO,OAAK,CAAC,YAAY,IAAI,CAAC,CAAC,EAC/B,KAAK;AAGR,IAAM,gBAA6D;AAAA,EACjE,IAAI,CAAC,WAAW;AAAA,EAChB,QAAQ,CAAC,UAAU,aAAa;AAAA,EAChC,KAAK,CAAC,UAAU,aAAa;AAAA,EAC7B,OAAO,CAAC,UAAU,aAAa;AAAA,EAC/B,OAAO,CAAC,cAAc;AACxB;AAOA,IAAM,SAA4B,CAAC,MAAM,aAAa;AA0B/C,SAAS,eAAe,OAAqC;AAClE,QAAM,SAAS,IAAI,IAAY,MAAM;AACrC,QAAM,UAAoB,CAAC;AAE3B,aAAW,QAAQ,MAAM,UAAU;AACjC,UAAM,MAAM,iBAAiB,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI;AACnE,QAAI,IAAK,QAAO,IAAI,GAAG;AAAA,aACd,EAAE,QAAQ,eAAgB,SAAQ,KAAK,IAAI;AAAA,EACtD;AACA,aAAW,SAAS,MAAM,QAAQ;AAChC,eAAW,OAAO,cAAc,KAAK,KAAK,CAAC,EAAG,QAAO,IAAI,GAAG;AAAA,EAC9D;AACA,MAAI,MAAM,WAAY,QAAO,IAAI,kBAAkB;AACnD,MAAI,MAAM,YAAY;AACpB,WAAO,IAAI,YAAY;AACvB,WAAO,IAAI,eAAe;AAAA,EAC5B;AACA,MAAI,MAAM,UAAW,QAAO,IAAI,WAAW;AAC3C,MAAI,MAAM,QAAS,QAAO,IAAI,SAAS;AAGvC,MAAI,OAAO,IAAI,QAAQ,EAAG,QAAO,IAAI,eAAe;AAEpD,QAAM,UAAU,eAAe,OAAO,OAAK,OAAO,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAK,EAAE,IAAI;AAC9E,aAAW,QAAQ,QAAQ;AACzB,QAAI,CAAC,OAAO,IAAI,IAAI,EAAG,OAAM,IAAI,MAAM,sCAAsC,IAAI,EAAE;AAAA,EACrF;AACA,SAAO,EAAE,SAAS,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE;AAC1D;;;AC7HO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAOO,IAAM,UAAU;AAAA,EACrB,SAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,EAC5C,cAAc,CAAC,MAAM,MAAM,IAAI;AAAA,EAC/B,QAAQ,CAAC,MAAM,MAAM,IAAI;AAAA,EACzB,eAAe,CAAC,MAAM,IAAI;AAAA,EAC1B,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,KAAK;AACP;AAMO,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,cAAc,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,cAAc,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,i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","names":["match"]}
|